这是我的示例脚本:
SELECT c2, c3, c4 FROM Table1
EXCEPT
SELECT c2, c3, c4 FROM Table2
我成功地从左表中返回了右表中不存在的唯一记录。两个表都具有相同的模式,并且大多数情况下都是相同的数据。问题是唯一ID(让我们称之为列c1)不匹配,所以我需要在上面的EXCEPT查询中排除它。如何返回同一组记录,但是包含唯一ID?
我在考虑在游标中使用临时表,游标和长WHERE语句,但这似乎不是一个非常优雅的解决方案。还有另一种方法来完成这个看似简单的任务吗?
答案 0 :(得分:2)
您可以使用提供的查询,只需使用表格inner join
即可获得您的“c1'列?
SELECT T1.* FROM Table1 T1 INNER JOIN(
SELECT c2, c3, c4 FROM Table1
EXCEPT
SELECT c2, c3, c4 FROM Table2
) a on a.c2=T1.c2 and a.c3=T1.c3 and a.c4=T1.c4
答案 1 :(得分:1)
试试这个
SELECT A.c1, A.c2, A.c3, A.c4
FROM Table1 A
LEFT OUTER JOIN Table2 B ON A.c2 = B.C2 AND A.c3 = B.C3 AND A.c4 = B.C4
WHERE B.c1 IS NULL;
答案 2 :(得分:1)
你可能可以使用“NOT EXISTS”而不是“EXCEPT”来完成它,因为使用“NOT EXISTS”你可以指定条件。这是一个指出这一点的线索:EXCEPT vs NOT EXISTS。
答案 3 :(得分:0)
这有点难看,在没有“有用”索引的大型表上,可能表现得非常糟糕,但它会完成这项工作:
SELECT t1.c1, t1.c2, t1.c3, t1.c4
from Table1 t1
inner join (-- Unique tuples
SELECT c2, c3, c4 FROM Table1
EXCEPT
SELECT c2, c3, c4 FROM Table2
) xx
on xx.c2 = t1.c2
and xx.c3 = t1.c3
and xx.c5 = t1.c4