Выберите НЕ В нескольких столбцах - PullRequest
60 голосов
/ 07 ноября 2011

Мне нужно реализовать следующий запрос

SELECT * 
FROM   friend 
WHERE  ( friend.id1, friend.id2 ) 
         NOT IN (SELECT id1, 
                        id2 
                 FROM   likes) 

, но NOT IN не может быть реализовано в нескольких столбцах. Как мне написать этот запрос

Ответы [ 3 ]

86 голосов
/ 07 ноября 2011

Я не уверен, что вы думаете:

select * from friend f
where not exists (
    select 1 from likes l where f.id1 = l.id and f.id2 = l.id2
)

это работает, только если id1 связан с id1, а id2 с id2 не оба.

18 голосов
/ 07 ноября 2011

Еще одна загадочно неизвестная СУБД. Ваш синтаксис прекрасно работает в PostgreSQL. Другие стили запросов могут выполняться быстрее (особенно вариант NOT EXISTS или LEFT JOIN), но ваш запрос вполне допустим.

Имейте в виду подводные камни с NOT IN, хотя при использовании любых NULL значений:

Вариант с левым соединением:

SELECT *
FROM   friend f
LEFT   JOIN likes l USING (id1, id2)
WHERE  l.id1 IS NULL;

См. Ответ @ Михала для варианта NOT EXISTS.
Более детальная оценка четырех основных вариантов:

0 голосов
/ 07 ноября 2011

Вам, вероятно, следует использовать NOT EXISTS для нескольких столбцов.

...