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 除了语句的主要内容,如果未能解决你的问题,请参考以下文章