TSQL INTERSECT关键字

时间:2010-01-27 11:12:21

标签: sql-server-2005 tsql sql-server-2008 join

我已经知道SQL Server 2005/2008关键字EXCEPTINTERSECT已经有一段时间了,但从来没有找到令人信服的理由使用INTERSECT而不是好的UNION }关键字。

有人可以解释您何时或为何使用INTERSECT代替UNION

3 个答案:

答案 0 :(得分:3)

他们做不同的事情。

来自MSDN:

EXCEPT返回左侧查询中的任何不同值,这些值在右侧查询中也找不到。

INTERSECT返回INTERSECT操作数左侧和右侧的查询返回的任何不同值。

UNION将两个或多个查询的结果合并到一个结果集中,该结果集包含属于联合中所有查询的所有行。

答案 1 :(得分:2)

INTERSECT返回两个记录集

中的记录

UNION返回任何记录集中的记录。

EXCEPT返回在第一个记录集中找到但不在第二个记录集中找到的记录。

由于INTERSECTEXCEPT只能返回第一个记录集中找到的记录,因此可以使用连接或IN / NOT IN谓词重写它们。

但是,它们有时更方便,因为SQL Server不支持多列上的IN表达式。

INTERSECTEXCEPT不同,

JOININNULL值视为匹配。这个查询:

SELECT  NULL
INTERSECT
SELECT  NULL

返回一条记录,而这一条:

SELECT  NULL
WHERE   NULL IN
        (
        SELECT  NULL
        )

什么都不返回。

答案 2 :(得分:1)

INTERSECT通常可以被INNER JOINS取代,所以可能是你没有找到它们的原因。

然而,EXCEPT是非常有趣的功能。 例如,想想一个简单的标记系统: 您使用“徽章”标记每个用户,并且您希望找到所有没有“评论家”徽章的用户。您可以使用EXCEPT功能轻松完成。 (虽然:这也可以表示为LEFT JOIN .. WHERE left_site IS NULL)