Я предполагаю, что вам нужна одна форма запроса, которую можно использовать для ответа на все три вопроса, а не разные типы запросов для каждого вопроса.
В этих решениях используется COUNT()
, не считая NULL
с. Когда OUTER JOIN
не соответствует строке в t2
, это приводит к NULL
для всех столбцов из t2
.
получить ID 10, если я попытаюсь найти (A, B, C)
ID 10 имеет три различных значения термина, и мы ищем все три.
SELECT t1.ID
FROM TableA t1 LEFT OUTER JOIN TableA t2
ON (t1.ID = t2.ID AND t1.term = t2.term AND t2.term IN ('A', 'B', 'C'))
GROUP BY t1.ID
HAVING COUNT(t1.term) = COUNT(t2.term);
НИЧЕГО не получите, если я попытаюсь найти (A, B)
И ID 10, и ID 20 имеют три разных значения термина, но наш поиск только для двух. Количество равно 3 = 2 для обоих идентификаторов, поэтому ни один из них не имеет равного числа.
SELECT t1.ID
FROM TableA t1 LEFT OUTER JOIN TableA t2
ON (t1.ID = t2.ID AND t1.term = t2.term AND t2.term IN ('A', 'B'))
GROUP BY t1.ID
HAVING COUNT(t1.term) = COUNT(t2.term);
получить ID 20, если я попытаюсь найти НЕ в (C, D)
ID 20 имеет три различных значения термина, и все три из них НЕ являются «C» или «D». Таким образом, количество равно.
SELECT t1.ID
FROM TableA t1 LEFT OUTER JOIN TableA t2
ON (t1.ID = t2.ID AND t1.term = t2.term AND t2.term NOT IN ('C', 'D'))
GROUP BY t1.ID
HAVING COUNT(t1.term) = COUNT(t2.term);