create table source_table (id number);
insert into source_table values(3);
insert into source_table values(1);
insert into source_table values(2);
create table target_table (id number, seq_val number);
create sequence example_sequence;
insert into target_table
select id, example_sequence.nextval
from
> (select id from source_table ***order by id***);
是否已正式保证,对于source_table中具有较低值的id,插入到source_table中时,相应序列的值也将较低?换句话说,是否保证插入时会保留 order by 子句提供的排序?
EDIT 问题不在于:“表中的行是否按这样排序?”而是“插入时我们可以依赖子查询中使用的 order by 子句吗?”。
为更进一步说明这一点,在上例中运行target table
之类的查询后,上例中select * from target_table order by id
的内容为:
ID | SEQ_VAL
1 1
2 2
3 3
此外,如果我在插入时指定降序排列:
insert into target_table
select id, example_sequence.nextval
from
> (select id from source_table ***order by id DESC***);
上面相同查询的输出为:
ID | SEQ_VAL
1 3
2 2
3 1
我敢肯定,我已经对其进行了多次测试。我的问题是“我可以一直依靠这种顺序吗?”
答案 0 :(得分:3)
表未排序,并且缺少ORDER BY
的游标结果集中的任何明显排序都是数据存储的人工产物,不能保证,并且桌子上的后续操作可能会导致这种明显的顺序发生变化。如果希望以特定方式对游标的结果进行排序,则必须使用ORDER BY
。