选择NOT IN多列

时间:2011-11-07 07:03:41

标签: sql database multiple-columns

我需要实现以下查询

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

但NOT IN无法在多列上实现。我该如何写这个查询

4 个答案:

答案 0 :(得分:86)

我不确定你是否考虑过:

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与两者都相关时才有效。

答案 1 :(得分:18)

另一个神秘未知的RDBMS。你的语法在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变体的回答 对四种基本变体的更详细评估:

答案 2 :(得分:3)

我使用的方法可能看起来很愚蠢,但对我有用。 我只是合并要比较的列并使用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)

答案 3 :(得分:-1)

您应该将NOT EXISTS用于多列。