`
liqian5251
  • 浏览: 16206 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle 合并查询

阅读更多
===   union 并集, intersect 交集, union all 并集+交集, minus差集


1.Oracle Minus关键字
  SQL中的MINUS关键字
  SQL中有一个MINUS关键字,它运用在两个SQL语句上,它先找出第一条SQL语句所产生的结果,然后看这些结果有没有在第二个SQL语句的结果中。如果有的话,那这一笔记录就被去除,而不会在最后的结果中出现。如果第二个SQL语句所产生的结果并没有存在于第一个SQL语句所产生的结果内,那这笔资料就被抛弃,其语法如下:
  [SQL Segment 1]
  MINUS
  [SQL Segment 2]
2.union all 关键字
在集合论中,两个集合(集合A和集合B)的并集是一个包含集合A和B中所有元素的集合。换句话说,如果一个元素属于任何一个输入集合,那么它也属于结果集。如图所示。



  对于集合运算,需要注意以下几点:

参与集合运算的两个查询生成的结果集必须包含相同的列数,并且相应列必须具有兼容的数据类型。
集合运算结果中的列名由第一个查询决定,因此,如果要为结果列分配别名,应该在第一个查询中分配相应的别名。
集合运算对行进行比较时,认为两个NULL值相等。
UNION集合运算分为UNION ALL和UNION DISTINCT两种情形,它们的区别是UNION ALL会保留重复行,而UNION DISTINCT会删除重复行。下面用例子来说明。

回到顶部
UNION ALL

UNION ALL合并两个集合,并保留重复行。关于UNION ALL需要注意以下几点:

UNION ALL实际上不会对行进行比较,也不会删除重复行,它只是做个合并的操作而已。
因为UNION ALL不会删除重复行,所以它的结果是多集,而不是真正的集合,因为相同的行在结果中可能出现多次。

3.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;
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics