我已经知道SQL Server 2005/2008关键字EXCEPT和INTERSECT已经有一段时间了,但从来没有找到令人信服的理由使用INTERSECT
而不是好的UNION
}关键字。
有人可以解释您何时或为何使用INTERSECT
代替UNION
?
答案 0 :(得分:3)
他们做不同的事情。
来自MSDN:
EXCEPT返回左侧查询中的任何不同值,这些值在右侧查询中也找不到。
INTERSECT返回INTERSECT操作数左侧和右侧的查询返回的任何不同值。
UNION将两个或多个查询的结果合并到一个结果集中,该结果集包含属于联合中所有查询的所有行。
答案 1 :(得分:2)
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
)
什么都不返回。
答案 2 :(得分:1)
INTERSECT通常可以被INNER JOINS取代,所以可能是你没有找到它们的原因。
然而,EXCEPT是非常有趣的功能。 例如,想想一个简单的标记系统: 您使用“徽章”标记每个用户,并且您希望找到所有没有“评论家”徽章的用户。您可以使用EXCEPT功能轻松完成。 (虽然:这也可以表示为LEFT JOIN .. WHERE left_site IS NULL)