Oracle中的order by分页排序问题

今天在系统测试的过程中,测试人员发现自己新添加的科目添加到系统中在页面默认分页查询中没有找到自己新加的科目(分页过程中页面显示数据确实和数据表中的数据总量一致),但是通过系统的搜索功能是可以查询的到数据?提了一个bug?

解决bug的过程:

系统中有一个科目表subject_manage表结构如下

create table SUBJECT_MANAGE
(
  ID          VARCHAR2(32) not null,
  SUBJECTNAME VARCHAR2(50),
  EXAMTASKID  VARCHAR2(32),
  EXAMTYPE    VARCHAR2(100)
)
comment on table SUBJECT_MANAGE
  is '用于高考、成考、自考等考试类型的科目日常管理。';
-- Add comments to the columns 
comment on column SUBJECT_MANAGE.SUBJECTNAME
  is '科目名称';
comment on column SUBJECT_MANAGE.EXAMTASKID
  is '考试类型ID';
comment on column SUBJECT_MANAGE.EXAMTYPE
  is '考试类型名称';
comment on column SUBJECT_MANAGE.STARTTIME
分页sql的语句为

select * from ( select row_.*, rownum rownum_ from (  select id,subjectname,examtaskid, examtype  from subject_manage where 1=1   order by examtype ) row_ where rownum <= index * pagesize) table_alias where table_alias.rownum_ >= (index - 1) * pagesize + 1

 当页面分页到index=3或index=4的时候就出现了重复数据,当时查看subject_manage表中的examtype字段有空值,当时就怀疑会不会是空字段引起的问题,就换了表中的id为排序字段,测试果然好使,之后就将examtype字段中为空的行填充一个默认值,再进行查询还是有重复字段 
  

examtype 列并不能确定其唯一性,那么ORACLE在每次执行排序时并不能确定数据的唯一性,导致同样的排序顺序但是每次运行时并不能保证得到一样的结果。

解决办法

select * from ( select row_.*, rownum rownum_ from (  select id,subjectname,examtaskid, examtype  from subject_manage where 1=1   order by examtype,id ) row_ where rownum <= index * pagesize) table_alias where table_alias.rownum_ >= (index - 1) * pagesize + 1
有以上的结论之后处理方法也就简单明了了,Order By中的字段必须能够确保唯一即可

你可能感兴趣的:(Oracle中的order by分页排序问题)