当查询包含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
这似乎不一致。那么这种行为的原因是什么?它是某种错误还是故意的?
答案 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