selectNOT IN多列

我需要实现以下查询

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

但是不能在多列上实现。 我如何编写这个查询

我不确定你是否想过:

 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不相关的情况。

另一个神秘的RDBMS。 你的语法在PostgreSQL中是完美的。 其他查询风格可能会执行得更快(尤其是NOT EXISTS变体或LEFT JOIN ),但是您的查询是完全合法的。

不过,在涉及任何NULL值时,要注意NOT IN的缺陷:

  • 查找连接不存在的logging

与左连接的变体:

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

请参阅@Michał对NOT EXISTS变体的回答。
四个基本变体的更详细的评估:

  • select其他表中不存在的行

您可能应该使用NOT EXISTS作为多列。