SQL Server 2008 EXCEPT语句

时间:2014-04-11 15:29:09

标签: sql sql-server sql-except

这是我的示例脚本:

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

我成功地从左表中返回了右表中不存在的唯一记录。两个表都具有相同的模式,并且大多数情况下都是相同的数据。问题是唯一ID(让我们称之为列c1)不匹配,所以我需要在上面的EXCEPT查询中排除它。如何返回同一组记录,但是包含唯一ID?

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

4 个答案:

答案 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