Ответ 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 не оба.
Мне нужно выполнить следующий запрос
SELECT *
FROM friend
WHERE ( friend.id1, friend.id2 )
NOT IN (SELECT id1,
id2
FROM likes)
но NOT IN не может быть реализовано на нескольких столбцах. Как написать этот запрос
Я не уверен, думаете ли вы о:
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 не оба.
Еще одна таинственно неизвестная РСУБД. Ваш синтаксис отлично подходит для 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
.
Более подробная оценка четырех основных вариантов:
Вероятно, вы должны использовать NOT EXISTS
для нескольких столбцов.