Мне нужно реализовать следующий запрос
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 EXISTS
LEFT JOIN
Имейте в виду подводные камни с NOT IN, хотя при использовании любых NULL значений:
NOT IN
NULL
Вариант с левым соединением:
SELECT * FROM friend f LEFT JOIN likes l USING (id1, id2) WHERE l.id1 IS NULL;
См. Ответ @ Михала для варианта NOT EXISTS. Более детальная оценка четырех основных вариантов:
Вам, вероятно, следует использовать NOT EXISTS для нескольких столбцов.