У меня есть таблица (foo):
fk | value
========
A | 1
A | 2
B | 1
C | 1
Я пытаюсь создать список всех fk, где не отображается определенное значение, например значение 2
.
Одна попытка заключалась бы в следующем:
SELECT fk
FROM foo
WHERE value <> 2;
Но это все равно вернет A, B, C
, потому что A
имеет две записи, а одна из них не 2
. Мне нужен B, C
вместо этого.
Как я могу решить эту проблему?
Или с помощью GROUP BY в сочетании с HAVING NOT и условным SUM
запрос
SELECT
foo.fk
FROM
foo
GROUP BY
foo.fk
HAVING
NOT SUM(foo.value = 2)
см. демо https://www.db-fiddle.com/f/kyP2ykqDEHTkM1E6NsdkEn/0
SUM
и (
нет пробелов).
Использовать not exists
:
select f.*
from foo f
where not exists (select 1 from foo f1 where f1.fk = f.fk and f1.value = 2);
subquery
с correlation
подходом. Нет какой - либо JOIN
участие.
Вы можете найти свой fk
сопоставленный с вашим значением, и устранить его:
SELECT f.fk
FROM foo f
WHERE f.fk NOT IN (SELECT f1.fk FROM foo f1 WHERE f1.value = 2)
f1.fk
не возвращает значение NULL, ... если у нас есть гарантия, что столбец fk
в foo
равен NULL, этого достаточно. В более сгенерированном случае мы можем включить AND f1.fk IS NOT NULL
в подзапрос, чтобы дать нам эту гарантию. (Если подзапросом будет возвращено хотя бы одно значение NULL, NOT IN
не будет иметь значение true.)