我已经知道关于SQL Server 2005/2008关键字EXCEPT和INTERSECT一段时间,但从来没有找到令人信服的理由使用INTERSECT
优于旧的UNION
关键字。TSQL INTERSECT关键字
任何人都可以解释什么时候或为什么要使用INTERSECT
而不是UNION
?
我已经知道关于SQL Server 2005/2008关键字EXCEPT和INTERSECT一段时间,但从来没有找到令人信服的理由使用INTERSECT
优于旧的UNION
关键字。TSQL INTERSECT关键字
任何人都可以解释什么时候或为什么要使用INTERSECT
而不是UNION
?
他们做不同的事情。
从MSDN:
EXCEPT返回从左边查询是不是也右边查询发现任何不同的值。
INTERSECT返回由INTERSECT操作数的左侧和右侧上的查询返回的任何不同的值。
UNION将两个或多个查询的结果合并到一个包含属于联合中所有查询的所有行的结果集中。在发现两个的记录
UNION
在记录集的任何发现返回记录
INTERSECT
返回记录。
EXCEPT
返回在第一个记录集中找到的记录,但不在第二个记录集中。
由于两个INTERSECT
和EXCEPT
只能返回在第一个记录中找到的记录,他们可以使用重写加入或IN
/NOT IN
谓词。
但是,它们有时更方便,因为SQL Server
不支持多列上的IN
表达式。
INTERSECT
和EXCEPT
,不像JOIN
和IN
,治疗NULL
值匹配。这个查询:
SELECT NULL
INTERSECT
SELECT NULL
返回的记录,而这一个:
SELECT NULL
WHERE NULL IN
(
SELECT NULL
)
回报什么。
是的,由于某种原因,我只是没有得到它,直到现在......多么可耻的我。 – Kane 2010-01-27 11:24:46
INTERSECT通常可以被INNER JOINS替换,所以可能是因为你没有发现它们有用。
但是除了相当有趣的功能。 例如,考虑一个简单的标记系统: 您为每个用户标记一个“徽章”,并且您希望查找所有没有“批评者”徽章的用户。您可以使用EXCEPT功能轻松完成此操作。 (虽然:这也可以表示为左连接..在哪里left_site是NULL)
Doh!我觉得自己像一个完全白痴,当然是有区别的......也许我应该更仔细地阅读MSDN。谢谢 – Kane 2010-01-27 11:21:30
我通常只是想象一个维恩图,当考虑这些:) – Oded 2010-01-27 11:57:51