我需要实现以下查询
SELECT *
FROM friend
WHERE ( friend.id1, friend.id2 )
NOT IN (SELECT id1,
id2
FROM likes)
但NOT IN无法在多列上实现。我该如何写这个查询
答案 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
用于多列。