gpt4 book ai didi

sql - order by 与 union all 子句的有趣行为

转载 作者:行者123 更新时间:2023-12-02 21:41:03 25 4
gpt4 key购买 nike

当查询包含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

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

最佳答案

声明

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

根本没有定义的顺序。 SQL中只有最外层的ORDER BY生效(除非设置了行限制)。

如果您仍然碰巧观察到查询结果中的顺序,那么这是一个巧合,它随时可能消失。

在声明中

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

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

使用最后一种形式。并将 order by 放入新行以使其更易于阅读。


How can I then sort just single select with union all?

如果没有 order-by 子句,union all 的输出顺序是不确定的。当然,这两个输入不能保证被连接起来。

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

关于sql - order by 与 union all 子句的有趣行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20459009/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com