首页 > 代码库 > INTERSECT(交集)集合运算

INTERSECT(交集)集合运算

在集合论中,两个集合(记为集合A和B)的交集是由既属于A,也属于B的所有元素组成的集合。

在T-SQL 中,INTERSECT 集合运算对两个输入查询的结果集取其交集,只返回在两个查询结果集中都出现的行。

INTERSECT DISTINCT集合运算

INTERSECT 集合运算在逻辑上首先删除两个输入多集中的重复行(把多集变为集合),然后返回只在两个集合中都出现的行。换句话说,如果一个行在两个输入多集中都至少出现一次,那么交集返回的结果中将包含这一行。

SELECT c FROM a

INTERSECT

SELECT d FROM b

INTERSECT ALL 集合运算

ANSI SQL 支持带有ALL选项的INTERSECT集合运算,但SQL Server 2008现在还没有实现这种运算。

回忆一下 UNION ALL 集合运算中 ALL 关键字的含义:要求返回所有重复行。类似地,INTERSECT ALL 集合运算中的 ALL 关键字也意味着不会删除重复行。但INTERSECT ALL 与UNION ALL有所不同:前者不会返回所有重复行,而只返回重复行数目较少的那个多集的所有重复行。换句话说,INTERSECT ALL 运算不仅关心一个行是否在两个多集同时存在,还关心它在每个多集中出现的次数。就好像这个集合运算会查找每行的每次匹配一样。

SELECT 

  ROW_NUMBER() OVER(PARTITION BY country,region,city ORDER BY(SELECT 0)) AS rownum,

  country,region,city

FROM dbo.Employees

INTERSECT

SELECT

  ROW_NUMBER() OVER(PARTITION BY country,region,city ORDER BY (SELECT 0)),

  country,region,city

FROM dbo.Customers;