94

我需要实现以下查询:

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

NOT IN不能在多列上实现。如何编写此查询?

4

4 回答 4

122

我不确定您是否考虑过:

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 不是两者都相关时,它才有效。

于 2011-11-07T07:12:19.957 回答
22

另一个神秘未知的 RDBMS。您的语法在 PostgreSQL 中非常好。其他查询样式可能执行得更快(尤其是NOT EXISTS变体或 a LEFT JOIN),但您的查询完全合法。

NOT IN但是,当涉及任何NULL值时,请注意 的陷阱:

带有左连接的变体:

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

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

于 2011-11-07T07:18:57.243 回答
9

我使用一种可能看起来很愚蠢但对我有用的方法。我只是连接我想要比较的列并使用 NOT IN:

SELECT *
FROM table1 t1
WHERE CONCAT(t1.first_name,t1.last_name) NOT IN (SELECT CONCAT(t2.first_name,t2.last_name) FROM table2 t2)
于 2020-04-23T11:01:46.073 回答
-1

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

于 2011-11-07T07:10:00.603 回答