Подтвердить что ты не робот

Выберите NOT IN несколько столбцов

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

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

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

4b9b3361

Ответ 1

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

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 не оба.

Ответ 2

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

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

Вариант с LEFT JOIN:

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

См. ответ @Michał для варианта NOT EXISTS.
Более подробная оценка четырех основных вариантов:

Ответ 3

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