SQL:在子查询中过滤多列

Bik*_*iki 2 sql t-sql sql-server correlated-subquery

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

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

C1  C2  C3
--  --  --
1   A   Z
2   B   Y
3   C   X
Run Code Online (Sandbox Code Playgroud)

我的Table2看起来像:

    D1  D2  
    --  --  
    1   A   
    2   Y
    3   X
Run Code Online (Sandbox Code Playgroud)

我的工作查询类似于:

slect * from Table1
where (C2 NOT IN (Select D2 from Table2);
Run Code Online (Sandbox Code Playgroud)

这工作正常,但如果我想根据两列的组合(即 D1 和 D2)进行过滤,那么我不能将查询写为:

slect * from Table1
where ((C1,C2) NOT IN (Select (D1,D2) from Table2);
Run Code Online (Sandbox Code Playgroud)

谁能帮我纠正上面的查询?

Tim*_*ter 5

使用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
)
Run Code Online (Sandbox Code Playgroud)

结果:

C1  C2  C3
2   B   Y
3   C   X
Run Code Online (Sandbox Code Playgroud)

这是一个演示:http : //sqlfiddle.com/#!3/81fdd/4/0

NOT EXISTS有更少的问题NOT IN

我应该使用 NOT IN、OUTER APPLY、LEFT OUTER JOIN、EXCEPT 还是 NOT EXISTS?