【发布时间】:2011-01-09 22:03:55
【问题描述】:
我已经知道 SQL Server 2005/2008 关键字 EXCEPT 和 INTERSECT 有一段时间了,但从来没有找到一个令人信服的理由来使用 INTERSECT 而不是旧的 UNION 关键字。
谁能解释一下您何时或为何使用INTERSECT 而不是UNION?
【问题讨论】:
标签: sql-server-2005 tsql sql-server-2008 join
我已经知道 SQL Server 2005/2008 关键字 EXCEPT 和 INTERSECT 有一段时间了,但从来没有找到一个令人信服的理由来使用 INTERSECT 而不是旧的 UNION 关键字。
谁能解释一下您何时或为何使用INTERSECT 而不是UNION?
【问题讨论】:
标签: sql-server-2005 tsql sql-server-2008 join
他们做不同的事情。
来自 MSDN:
EXCEPT 返回左侧查询中未在右侧查询中找到的任何不同值。
INTERSECT 返回由 INTERSECT 操作数左右两侧的查询返回的任何不同值。
UNION 将两个或多个查询的结果组合成一个结果集,其中包括属于联合中所有查询的所有行。
【讨论】:
INTERSECT 返回在两个记录集中找到的记录
UNION 返回在任何个记录集中找到的记录。
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
)
什么都不返回。
【讨论】:
INTERSECT 通常可以被 INNER JOINS 替换,所以这可能是您觉得它们没用的原因。
不过,EXCEPT 是一个非常有趣的功能。 例如考虑一个简单的标记系统: 例如,您使用“徽章”标记每个用户,并且您希望找到所有没有“评论”徽章的用户。您可以使用 EXCEPT 功能轻松做到这一点。 (虽然:这也可以表示为 LEFT JOIN .. WHERE left_site IS NULL)
【讨论】: