Oracle中的order by分頁排序問題

2021-07-16 12:44:11 字數 1643 閱讀 7983

今天在系統測試的過程中,測試人員發現自己新新增的科目新增到系統中在頁面預設分頁查詢中沒有找到自己新加的科目(分頁過程中頁面顯示資料確實和資料表中的資料總量一致),但是通過系統的搜尋功能是可以查詢的到資料?提了乙個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中文排序

在使用order by排序的時候,出現如下情況 印象中中文排序應該預設是按照拼音排序的,為何 鑫 會排在 中 的後面呢?猜想order by是不是根據對應字元的ascii碼排的呢,因此列出了對應的ascii,如下 由此基本可以斷定,確實是通過ascii的大小來排序的,這也解釋了為什麼數字會排在字母之...

oracle中order by造成分頁錯誤

問題 今天在工作中,在service中呼叫分頁查詢列表介面的時候,返回的到頁面的資料中總是存在缺失的資料,還有重複的資料。分析 select from select rownum rn,t.from select from student order by class t where rownum ...

十一 Sql server中order by的用法

在上面幾節中我們學習了一些條件語句,但不知對這些選擇的資料如何排序,如果要對資料排序,那該怎麼辦呢?這時就可以用到 order by 指令了。先看下它的語法 select 欄位名 from 名 where 條件 order by 欄位名 asc,desc 假如有乙個教師資訊表 而我們想要按年齡由小大...