我想从表中选择所有行,这些行不存在于另一个表的ID列中。
例如,我的 Table1 具有以下结构:
C1 C2 C3
-- -- --
1 A Z
2 B Y
3 C X
我的表2 看起来像:
D1 D2
-- --
1 A
2 Y
3 X
我的工作查询类似于:
slect * from Table1
where (C2 NOT IN (Select D2 from Table2);
这样可以正常工作,但如果我想根据两个列的组合进行过滤(即D1和D2,那么我就不能将查询写成:
slect * from Table1
where ((C1,C2) NOT IN (Select (D1,D2) from Table2);
任何人都可以帮我纠正上述问题吗?
答案 0 :(得分:4)
使用NOT EXISTS
:
SELECT t.* from Table1 t
WHERE NOT EXISTS
(
SELECT 1 FROM Table2 t2
WHERE t.C1 = t2.D1
AND t.C2 = t2.D2
)
结果:
C1 C2 C3
2 B Y
3 C X
这是一个演示:http://sqlfiddle.com/#!3/81fdd/4/0
无论如何, NOT EXISTS
的分数比NOT IN
更少:
Should I use NOT IN, OUTER APPLY, LEFT OUTER JOIN, EXCEPT, or NOT EXISTS?
答案 1 :(得分:0)
SELECT T1.*
FROM Table1 AS T1
LEFT JOIN Table2 AS T2
ON T2.D1 = T1.C1
AND T2.D2 = T1.C2
WHERE T2.D1 IS NULL