Всякий раз, когда у вас возникает проблема типа «Мне нужны идентификаторы из этой таблицы, где есть одна строка со значением A, а другая строка со значением B, и обе строки имеют тот же идентификатор», вам нужно выбрать все строки, соответствующие вашим критериям, сгруппируйте их, а затем подсчитайте и используйте только те строки, которые имеют соответствующий счетчик:
SELECT t2.id
FROM table1 t1 JOIN table2 t2 ON t1.id = t2.id
WHERE t1.type = 'square' and t2.code IN ('G66', 'K79')
GROUP BY t2.id
HAVING COUNT(*) = 2
Если могут быть какие-то поддельные результаты, такие как две строки, которые являются G66, и нет строк, которые K79, тогда этот простой подсчет будет проигран. Вместо этого мы можем посмотреть значения (если это 2), используя MIN и MAX:
SELECT t2.id
FROM table1 t1 JOIN table2 t2 ON t1.id = t2.id
WHERE t1.type = 'square' and t2.code IN ('G66', 'K79')
GROUP BY t2.id
HAVING MIN(t2.code) = 'G66' AND MAX(t2.code) = 'K79'
Это работает, потому что по алфавиту G66 меньше K79, поэтому G66 будет минимальным
Если у нас есть 3 значения, которые мы должны указать, мы можем сделать какой-нибудь трюк, например, превратить все коды в число и потребовать, чтобы сумма была чем-то. Я буду использовать для этого базу 2:
SELECT t2.id
FROM table1 t1 JOIN table2 t2 ON t1.id = t2.id
WHERE t1.type = 'square' and t2.code IN ('G66', 'K79', 'X99')
GROUP BY t2.id
HAVING SUM(CASE t2.Code WHEN 'G66' THEN 1 WHEN 'K79' THEN 2 WHEN 'X99' THEN 4 END) = 7
Если мы сопоставим их с 1, 2 и 4, тогда единственный способ получить 7 (если значения уникальны) - иметь по одному из каждого. Если бы могло быть 7 G66 и ни один из остальных, дающих ложный результат, тогда нам, возможно, пришлось бы считать их по отдельности:
SELECT t2.id
FROM table1 t1 JOIN table2 t2 ON t1.id = t2.id
WHERE t1.type = 'square' and t2.code IN ('G66', 'K79', 'X99')
GROUP BY t2.id
HAVING
SUM(CASE t2.code WHEN 'G66' THEN 1 ELSE 0 END) = 1 AND
SUM(CASE t2.code WHEN 'K79' THEN 1 ELSE 0 END) = 1 AND
SUM(CASE t2.code WHEN 'X99' THEN 1 ELSE 0 END) = 1