关于union all和union的顺序

浏览: 2782

给别人解决问题突然想到一个有意思的东西:

union 和 union all的执行顺序是怎样的?

大家都知道union是排序去重的,而union all则是单纯的把数据放在一起。

现有如下SQL:

select 1 from dual   --A
union all
select 1 from dual   --B
union
select 2 from dual   --C
union all
select 1 from dual   --D

那么问题来了,oracle在执行这段SQL的顺序是怎么样的?

A.  (A union all B) union (C union all D)

B.  ((A union all B) union C) union all D

C.  A union all (B union C) union all D

D.  A union all (B union (C union all D))

究竟应该是哪一种呢?

经过各种测试发现,正确答案应该是B,也就是说union和union all是没有优先级的,完全按照从上到下的顺序依次执行,所以如果有需要去重和不去重的SQL同时出现时,一定要注意好SQL顺序,必要时需要拆分SQL。

若多个SQL都需要去重,可以选择只在最后一段SQL写union,可以少几次排序。  :)


Tips:  union 和 union all时,列名是由第一段SQL指定的,后面几段可以不写别名,如若第一段不写别名,后面写别名也不起作用。

推荐 4
本文由 老头子 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

2 个评论

感谢大神分享,非常有帮助
虽然经常用,不过还是了解了解

要回复文章请先登录注册