给别人解决问题突然想到一个有意思的东西:
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指定的,后面几段可以不写别名,如若第一段不写别名,后面写别名也不起作用。