问题
I need to implement the following query
SELECT *
FROM friend
WHERE ( friend.id1, friend.id2 )
NOT IN (SELECT id1,
id2
FROM likes)
but NOT IN can't be implemented on multiple columns. How do I write this query
回答1:
I'm not sure whether you think about:
select * from friend f
where not exists (
select 1 from likes l where f.id1 = l.id and f.id2 = l.id2
)
it works only if id1 is related with id1 and id2 with id2 not both.
回答2:
Another mysteriously unknown RDBMS. Your Syntax is perfectly fine in PostgreSQL. Other query styles may perform faster (especially the NOT EXISTS
variant or a LEFT JOIN
), but your query is perfectly legit.
Be aware of pitfalls with NOT IN
, though, when involving any NULL
values:
- Find records where join doesn't exist
Variant with LEFT JOIN:
SELECT *
FROM friend f
LEFT JOIN likes l USING (id1, id2)
WHERE l.id1 IS NULL;
See @Michał's answer for the NOT EXISTS
variant.
A more detailed assessment of four basic variants:
- Select rows which are not present in other table
回答3:
You should probably use NOT EXISTS
for multiple columns.
来源:https://stackoverflow.com/questions/8033604/select-not-in-multiple-columns