Sql server 2005 TSQL INTERSECT关键字
我知道SQL Server 2005/2008关键字,已经有一段时间了,但从未找到令人信服的理由使用Sql server 2005 TSQL INTERSECT关键字,sql-server-2005,tsql,sql-server-2008,join,Sql Server 2005,Tsql,Sql Server 2008,Join,我知道SQL Server 2005/2008关键字,已经有一段时间了,但从未找到令人信服的理由使用INTERSECT而不是传统的UNION关键字 有人能解释一下什么时候或者为什么你会使用INTERSECT而不是UNION 从MSDN: Exception从左侧查询返回在右侧查询中找不到的任何不同值 INTERSECT返回INTERSECT操作数左右两侧的查询返回的任何不同值 UNION将两个或多个查询的结果合并到一个结果集中,该结果集中包含属于UNION中所有查询的所有行。INTERSECT返
INTERSECT
而不是传统的UNION
关键字
有人能解释一下什么时候或者为什么你会使用
INTERSECT
而不是UNION
从MSDN:
Exception从左侧查询返回在右侧查询中找不到的任何不同值
INTERSECT返回INTERSECT操作数左右两侧的查询返回的任何不同值
UNION将两个或多个查询的结果合并到一个结果集中,该结果集中包含属于UNION中所有查询的所有行。
INTERSECT
返回在两个记录集中找到的记录
UNION
返回在任何记录集中找到的记录
EXCEPT
返回在第一个记录集中找到的记录,但不在第二个记录集中找到
由于INTERSECT
和EXCEPT
只能返回在第一个记录集中找到的记录,因此可以使用连接或中的而不是谓词重写它们
但是,它们有时更方便,因为SQL Server不支持多列上的表达式中的
相交
和除
之外,与
中的连接
和不同,将空值
视为匹配值。此查询:
SELECT NULL
INTERSECT
SELECT NULL
返回一条记录,而此记录:
SELECT NULL
WHERE NULL IN
(
SELECT NULL
)
不返回任何内容。交集通常可以由内部联接替换,因此这可能是您不认为它们有用的原因
然而,这是一个非常有趣的特性。
例如,设想一个简单的标签系统:
您用“徽章”标记每个用户,并希望找到所有没有“批评家”徽章的用户。您可以使用EXCEPT功能轻松地做到这一点。(虽然:这也可以表示为LEFT JOIN.。其中LEFT_site为NULL)Doh!我觉得自己像个十足的白痴,当然有区别。。。也许我应该更仔细地阅读MSDN。谢谢,我通常只是想象一个维恩图,当考虑这些:)是的,出于某种原因,我只是到现在才明白。。。我真可耻。