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

i2loujxw  于 7个月前  发布在  Oracle
关注(0)|答案(1)|浏览(113)

这正如预期的那样工作:

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-也就是说,只有最后三个数字被排序。
我的问题是:为什么它会这样?
P.S.我知道我可以通过用select * from (...) Package 复合查询来解决这个问题。

qyzbxkaa

qyzbxkaa1#

虽然当你在一个空表中执行一个RST-SELECT-ORDER-BY时可能会有一些顺序,仅仅是由于块的填充,实际上没有保证(正如其他人所指出的那样)。
如果你真的想对数据的位置有一些控制,那么你需要看看属性聚类等选项,这些选项仍然在直接模式操作(插入-追加,CTAS,alter table move等)中应用。
该功能的演练在这里
https://youtu.be/UndmvLZ4KSI
或者,对于非直接加载操作,您可以查看预先确定数据物理存储的选项,例如

  • 索引组织表
  • B树聚类
  • 散列簇

相关问题