Oracle按排序的订单是否稳定?

Oracle按排序的订单是否稳定?,oracle,oracle11g,Oracle,Oracle11g,Oracle版本是Oracle Database 11g Enterprise Edition 11.2.0.4.0版-64位生产版 插入10000条具有相同名称值的记录,然后按名称排序,pageSize为1000,最终可以成功获得10000个id。这样看来,这种情况是稳定的 插入sql: @Insert("insert into org_info(isvalid, update_time, org_uni_code,ORG_CHI_NAME) values(#{isvalid}, TO_TIM

Oracle版本是Oracle Database 11g Enterprise Edition 11.2.0.4.0版-64位生产版 插入10000条具有相同名称值的记录,然后按名称排序,pageSize为1000,最终可以成功获得10000个id。这样看来,这种情况是稳定的

插入sql:

@Insert("insert into org_info(isvalid, update_time, org_uni_code,ORG_CHI_NAME) values(#{isvalid}, TO_TIMESTAMP(#{updateTimeStr}, 'yyyy-mm-dd hh24:mi:ss.ff'), #{orgUniCode},#{name})")
void insertOrgInfo(int isvalid, String updateTimeStr, Long orgUniCode, String name);
查询sql:

@Select("select org_uni_code from (" +
        " select org_uni_code, rownum rn from(" +
        " select org_uni_code from org_info where update_time >= TO_TIMESTAMP(#{updateTimeStr}, 'yyyy-mm-dd hh24:mi:ss.ff') order by ORG_CHI_NAME" +
        " )" +
        " ) where rn > #{start} and rn<=#{end}")
List<Long> pagingGetOrgUniCodeList(String updateTimeStr, int start, int end);

Oracle数据库排序不稳定;插入数据的方式与返回数据的方式没有保证的关系

请注意,这意味着当请求的排序顺序中存在关联时,原始顺序将被保留。询问Oracle是否有稳定排序与询问更常见的问题略有不同:Oracle是否会按插入的顺序返回行

很多时候,Oracle排序看起来是稳定的,但是很容易构建证明排序不稳定的测试用例。如果我们想要保证排序行为,我们必须在ORDERBY子句中完全指定表达式

例如,下面的普通测试用例按顺序1、2、3为B列插入值。但当按A排序时,它返回的B值顺序为1,3,2

--drop table table1;
create table table1(a number, b number);
insert into table1 select 1,1 from dual;
insert into table1 select 1,2 from dual;
insert into table1 select 1,3 from dual;

select * from table1 order by a;

A   B
-   -
1   1
1   3
1   2

精确的算法没有文档记录,因此这种行为可能不容易重现。但是如果你充分利用排序,你会很容易找到排序不稳定的例子。

向我们展示插入和查询的SQL。@StephenC已经添加了插入和查询sqlROWNUM是Oracle特有的功能,一个在排序之前应用于结果集的伪列。如果您必须依赖派生表子查询中的排序,我建议您使用ROW\ U NUMBER OVERORDER BY。。。相反,我非常肯定这种情况不仅限于Oracle。SQL表表示无序集。您的结果是绝对稳定的,因为列是经过完美排序的。SQL表中的排序只有在具有确定性order by子句时才是稳定的。@AnkitBajpai我更新了我的答案,解释了稳定排序的含义。我以前没听说过这个短语,但我相信我的测试用例是一个非稳定排序的例子。是的,Oracle完全按照A排序,但它没有保留行的实际顺序。因为,正如您所指出的,SQL表是无序集。@JonHeller在我的例子中,我不在乎是否按插入顺序返回行?我只想返回所有行,不重复,例如插入100个用户记录,所有这些用户记录都有相同的名称,然后按名称分页查询顺序pageSIze是10我只想每个页面都有不同的用户id,如果满足我的这一要求,它是稳定的。如果同一条记录,例如,1个约翰出现在几页中,则为unstable@zhuguowei看来我误解了你的问题。如果您想避免重复,您可以简单地将最里面的select org_uni_代码更改为select distinct org_uni_代码吗?