我有以下表格:
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)
我认为之前的查询效率不高。出于这个原因,我正在寻找更好的东西
任何帮助将不胜感激
答案 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)
上的索引。