Создать список всех строк, где значение не отображается

0

У меня есть таблица (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 вместо этого.

Как я могу решить эту проблему?

  • 0
    Спасибо за ваши решения. Они все работают :)
  • 0
    Спасибо за подсказку, я не заметил ошибки
Теги:

3 ответа

4
Лучший ответ

Или с помощью 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

  • 0
    Примечание для себя : убедитесь, что между SUM и ( нет пробелов).
3

Использовать not exists:

select f.*
from foo f
where not exists (select 1 from foo f1 where f1.fk = f.fk and f1.value = 2);
  • 0
    Это самостоятельное соединение?
  • 0
    @ MạnhQuyếtNguyễn. , , Нет, это subquery с correlation подходом. Нет какой - либо JOIN участие.
Показать ещё 2 комментария
2

Вы можете найти свой fk сопоставленный с вашим значением, и устранить его:

SELECT f.fk
FROM foo f
WHERE f.fk NOT IN (SELECT f1.fk FROM foo f1 WHERE f1.value = 2)
  • 0
    Просто убедитесь, что f1.fk не возвращает значение NULL, ... если у нас есть гарантия, что столбец fk в foo равен NULL, этого достаточно. В более сгенерированном случае мы можем включить AND f1.fk IS NOT NULL в подзапрос, чтобы дать нам эту гарантию. (Если подзапросом будет возвращено хотя бы одно значение NULL, NOT IN не будет иметь значение true.)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню