如何通过2列比较选择另一个表中不存在的行?

时间:2018-06-01 23:09:03

标签: sql sql-server-2008

我有以下表格:

T1                    T2                Desired result
    CA   CB             CA    CC               CA   CB
     1    2              1     3                1    4
     1    4              1     2                2    1
     1    3              1     5                2    3 
     2    1              2     4
     2    3
     3    6
     3    1
     4    ...

我需要在T1和T2之间建立连接(使用列CA)并且仅返回在T2.CC中不存在CB中的值的那些行

实现这一目标的一种简单方法是使用以下查询:

    SELECT T1.* FROM T1 INNER JOIN T2 ON t1.CA = t2.CA AND 
    t1.CB NOT IN (SELECT CC FROM T2 WHERE T2.CA = T1.CA)

我认为之前的查询效率不高。出于这个原因,我正在寻找更好的东西

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:1)

通常,实现此类结果的更有效方法是找到失败更简单的连接条件的记录。可以通过执行外连接并检查null来找到它们,如下所示:

select t1.ca, t1.cb
from t1 left outer join t2 on t1.ca=t2.ca and t1.cb=t2.cc
where t2.ca is null;

答案 1 :(得分:0)

我想你只想要not exists

select t1.*
from t1
where not exists (select 1
                  from t2
                  where t2.ca = t1.ca and t2.cb = t1.cb
                 );

为了提高性能,您需要t2(ca, cb)上的索引。