Sql server 2005 TSQL INTERSECT关键字

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返

我知道SQL Server 2005/2008关键字,已经有一段时间了,但从未找到令人信服的理由使用
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。谢谢,我通常只是想象一个维恩图,当考虑这些:)是的,出于某种原因,我只是到现在才明白。。。我真可耻。