我需要实现以下查询:
SELECT *
FROM friend
WHERE ( friend.id1, friend.id2 )
NOT IN (SELECT id1,
id2
FROM likes)
但是NOT IN
不能在多列上实现。如何编写此查询?
我需要实现以下查询:
SELECT *
FROM friend
WHERE ( friend.id1, friend.id2 )
NOT IN (SELECT id1,
id2
FROM likes)
但是NOT IN
不能在多列上实现。如何编写此查询?
not in
或not exists
工作,只有left join where = null
战略将与OpenEdge工作。
Answers:
我不确定您是否考虑过:
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相关联而不同时与之相关时,它才有效。
select 1 from likes l where coalesce(f.id1, 0) = coalesce(l.id1, 0) and coalesce(f.id2, 0) = coalesce(l.id2, 0)
另一个神秘未知的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;
有关NOT EXISTS
变体,请参见@Michał的答案。
对四个基本变体进行更详细的评估:
我使用的方法可能看起来很愚蠢,但对我有用。我只是合并要比较的列并使用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)
您可能应该使用NOT EXISTS
多个列。