SQL:在子查询中使用多列进行筛选

SQL:在子查询中使用多列进行筛选,sql,sql-server,tsql,correlated-subquery,Sql,Sql Server,Tsql,Correlated Subquery,我想从一个表中选择所有行,这些行不在另一个表的ID列中 例如,我的表1具有以下结构: 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); 这很好,但是如果我

我想从一个表中选择所有行,这些行不在另一个表的ID列中

例如,我的表1具有以下结构:

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);

有人能帮我纠正上述问题吗?

使用
不存在

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
下面是一个演示:

不存在
不在
中的作用小:


您的第一个
需要是
t.C1=t2.D1
恐怕这里一行中C1和C2之间的关系无法保持!!!@Biki:我已经编辑了我的答案。不确定您是否引用了第一个版本。我还添加了一个演示。带
1 a Z
的行被删除,因为有一行
1A
在第二个表中。谢谢,您更新的查询按照我的要求运行得非常好。
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