2010-01-27 60 views
3

我已经知道关于SQL Server 2005/2008关键字EXCEPTINTERSECT一段时间,但从来没有找到令人信服的理由使用INTERSECT优于旧的UNION关键字。TSQL INTERSECT关键字

任何人都可以解释什么时候或为什么要使用INTERSECT而不是UNION

回答

3

他们做不同的事情。

从MSDN:

EXCEPT返回从左边查询是不是也右边查询发现任何不同的值。

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

UNION将两个或多个查询的结果合并到一个包含属于联合中所有查询的所有行的结果集中。在发现两个的记录

UNION记录集的任何发现返回记录

+1

Doh!我觉得自己像一个完全白痴,当然是有区别的......也许我应该更仔细地阅读MSDN。谢谢 – Kane 2010-01-27 11:21:30

+1

我通常只是想象一个维恩图,当考虑这些:) – Oded 2010-01-27 11:57:51

2

INTERSECT返回记录。

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

由于两个INTERSECTEXCEPT只能返回在第一个记录中找到的记录,他们可以使用重写加入或IN/NOT IN谓词。

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

INTERSECTEXCEPT,不像JOININ,治疗NULL值匹配。这个查询:

SELECT NULL 
INTERSECT 
SELECT NULL 

返回的记录,而这一个:

SELECT NULL 
WHERE NULL IN 
     (
     SELECT NULL 
     ) 

回报什么。

+0

是的,由于某种原因,我只是没有得到它,直到现在......多么可耻的我。 – Kane 2010-01-27 11:24:46

1

INTERSECT通常可以被INNER JOINS替换,所以可能是因为你没有发现它们有用。

但是除了相当有趣的功能。 例如,考虑一个简单的标记系统: 您为每个用户标记一个“徽章”,并且您希望查找所有没有“批评者”徽章的用户。您可以使用EXCEPT功能轻松完成此操作。 (虽然:这也可以表示为左连接..在哪里left_site是NULL)