【问题标题】:SQL Server 2008 EXCEPT statementSQL Server 2008 除了语句
【发布时间】:2014-04-11 15:29:09
【问题描述】:

这是我的示例脚本:

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

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

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

【问题讨论】:

  • 如果两个表中都存在一条记录,您要提取哪个唯一 ID?

标签: sql sql-server sql-except


【解决方案1】:

你能接受你提供的查询,然后简单地 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

【讨论】:

  • +1 因为你打败了我(但你想检查你的表别名......)
  • matt - 当使用左外连接和扫描表一次就可以达到相同的结果时,为什么要扫描表两次。
  • @rs。 - 我想使用 OP 的原始查询,因为我知道它已经产生了他想要的所有结果,减去 c1。
  • @PhilipKelley - 如果您愿意,您可以编辑我的帖子以重命名我的表格/别名!我对最佳实践不太熟悉,所以我不确定在你眼中我做错了什么。
  • @MattH,Philip 想说的是你使用了错误的别名 a.c2=T1.c2 and a.c3=T.c3 and a.c4=T.c4 应该是 a.c2=T1.c2 and a.c3=T1.c3 and a.c4=T1.c4
【解决方案2】:

试试这个

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;

【讨论】:

  • 谢谢,我试试这个。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    这有点难看,并且在缺少“有用”索引的大型表上,性能可能很差,但它会起作用:

    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
    

    【讨论】:

      猜你喜欢
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-06
      • 1970-01-01
      • 2012-07-17
      相关资源
      最近更新 更多