使用 union-all 和 order-by 的复合查询仅对最后一部分而不是整个查询进行排序

问题描述 投票:0回答:1

这按预期工作:

select * from table(sys.OdciNumberList(2,1,3))
union all
select * from table(sys.OdciNumberList(5,6,4))
union all
select * from table(sys.OdciNumberList(9,7,8))
order by 1;

这按预期工作:

create table q1(id number generated always as identity, val number);

insert into q1 (val)
select * from table(sys.OdciNumberList(2,1,3))
order by 1;

select * from q1 order by id;

但不是这个:

create table q3(id number generated always as identity, val number);

insert into q3 (val)
select * from table(sys.OdciNumberList(2,1,3))
union all
select * from table(sys.OdciNumberList(5,6,4))
union all
select * from table(sys.OdciNumberList(9,7,8))
order by 1;

select * from q3 order by id;

我收到以下结果:

2 1 3  5 6 4  7 8 9
- 也就是说,仅对最后三个数字进行排序。
我的问题是:为什么会这样?

附注我知道我可以通过用

select * from (...)
包装复合查询来解决这个问题。

oracle insert sql-order-by
1个回答
0
投票

虽然当您对空表执行 INSERT-SELECT-ORDER-BY 时可能会出现一些排序,但仅仅由于块的数量,实际上没有任何保证(正如其他人指出的那样)。

如果您确实想对数据的放置位置进行一些控制,那么您需要查看诸如属性集群之类的选项,这些选项仍然在直接模式操作期间应用(插入追加、CTAS、更改表移动)等)。

该功能的演练在这里

https://youtu.be/UndmvLZ4KSI

或者,对于非直接加载操作,您可以查看预先确定数据物理存储的选项,例如

  • 索引组织表
  • b 树簇
  • 哈希集群
© www.soinside.com 2019 - 2024. All rights reserved.