SQL Server 2008 除了语句

Posted

技术标签:

【中文标题】SQL Server 2008 除了语句【英文标题】:SQL Server 2008 EXCEPT statement 【发布时间】: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? 【参考方案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

【讨论】:

以上是关于SQL Server 2008 除了语句的主要内容,如果未能解决你的问题,请参考以下文章

Sql Server 2008收缩日志语句

SQL Server 2008 中的 MERGE 语句

使用 SQL Server 2008 R2 的动态案例语句

SQL Server 2008 R2 - 将查询结果保存为 phpmyadmin 可读的 SQL 语句?

SQL Server2008R2循环语句

SQL Server 2008 使用 case 语句查看错误