使用union all子句的有趣行为

时间:2013-12-08 21:00:15

标签: sql oracle oracle11g

当查询包含union all时,我遇到了order by子句的一个有趣行为。

例如,我有以下查询:

select * from dual order by 1
union all
select * from dual

它失败了,是什么?

好吧,似乎oracle不喜欢order by后跟union all。让我们将查询重写为以下内容:

select * from (select * from dual order by 1)
union all
select * from dual

这是固定的!

如果我只是交换两个查询,那么它也会有用,所以order by的一个查询结束了:

select * from dual
union all
select * from dual order by 1

这似乎不一致。那么这种行为的原因是什么?它是某种错误还是故意的?

1 个答案:

答案 0 :(得分:5)

声明

select * from (select * from dual order by 1)

根本没有明确的订单。只有最外层的ORDER BY在SQL中生效(除非设置了行限制)。

如果您仍然在查询结果中观察到顺序,这可能会随时消失。

声明

select * from dual
union all
select * from dual order by 1

order by附加到union all,而不是第二select。因此,它是顶级的,定义明确。

使用最后一个表格。并将order by放入一个新行,以便于阅读。


  

我怎样才能用union all对单个select进行排序?

union all的输出顺序是未定义的,没有order-by子句。当然,这两个输入不能保证连接在一起。

select *, 1 as Tag from dual
union all
select *, 2 as Tag from dual
order by Tag, 1 --simulate ordered concatenation of inputs