0

这是我的示例脚本:

SELECT c2, c3, c4 FROM Table1
EXCEPT
SELECT c2, c3, c4 FROM Table2

我成功地从左表返回了右表中不存在的唯一记录。两个表具有相同的架构和大部分相同的数据。问题是唯一id(我们称之为c1列)不匹配,所以我需要在上面的EXCEPT查询中排除它。如何返回相同的记录集,但包含唯一 ID?

我正在考虑在游标内使用临时表、游标和长 WHERE 语句,但这似乎不是一个非常优雅的解决方案。还有其他方法可以完成这个看似简单的任务吗?

4

4 回答 4

2

您可以使用您提供的查询,并简单地inner join使用表 1 来获取您的“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
于 2014-04-11T15:37:45.647 回答
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;
于 2014-04-11T15:32:13.857 回答
1

您可能可以使用“NOT EXISTS”而不是“EXCEPT”来完成它,因为使用“NOT EXISTS”您可以指定条件。这是一个指出这一点的线程:EXCEPT vs NOT EXISTS

于 2014-04-11T15:36:04.847 回答
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
于 2014-04-11T15:40:10.980 回答