Oracle ROWNUM排序查詢資料丟失

2021-09-24 10:34:01 字數 1209 閱讀 8559

客戶反饋,上級使用者查詢的資料與下級查詢的資料對不上。

由於上級使用者查詢的許可權比較大,資料多,不會出現;下級只能查詢管轄許可權內的資料,而出現問題的多條資料剛好處於分頁的最後與下頁的開始,猜測可能sql語句寫的有問題。

select *

from (select rownum orderby, s.*

from (select * from t order by regioncode, areacode, create_time, companyname) s

where rownum <= 10

)where orderby > 0

分析完sql語句,感覺寫法不存在問題。

sql語句沒有問題的話,應該資料存在問題。經查詢,發現排序的 regioncode,areacode,create_time,companyname 資料是一樣的,會不會與rownum有關係呢?

查詢相關資料,rownum是oracle引入的虛列。 在物理上這個虛列並不存在,只是在查詢時才構造出來。偽列通常是自由分配的,使用者無法執行修改等操作。有以下特點:

rownum不屬於任何表。

rownum存在的前提:先有結果表。

rownum總是從1開始。

rownum一般只和<(<=)一起用。

使用rownum進行分頁查詢需要把rownum轉化為實列,並針對rownum查詢。

可參考 

研究後發現分頁語法也正確,那到了問題出現在什麼地方的?

猜測可能排序資料一致引起,於是在 order by 後 新增了id,id 為 guid,調整後,果然分頁引起的資料丟失解決了。

select *

from (select rownum orderby, s.*

from (select * from t order by regioncode, areacode, create_time, companyname,id) s

where rownum <= 10

)where orderby > 0

oracle rownum使用小記

對於 oracle 的 rownum 問題,很多資料都說不支援 between.and,只能用以上符號 並非說用 gt between.and 時會提示sql語法錯誤,而是經常是查不出一條記錄來,還會出現似乎是莫名其妙的結果來,其實您只要理解好了這個 rownum 偽列的意義就不應該感到驚奇,同樣是...

oracle rownum終極講解

oracle中rownum偽字段用得比較頻繁,特別是分頁之中,但是由於它的一些特殊性很多人可能並不理解它的實際行為,網路上有很多文章介紹這個 rownum的用法,但是很多都講得非常模糊,或者就是不太全面,大家看起來也非常痛苦,在這裡我將給大家全面講解一下,希望對大家有所幫助 首先我們來認識幾點row...

oracle rownum終極講解

oracle中rownum偽字段用得比較頻繁,特別是分頁之中,但是由於它的一些特殊性很多人可能並不理解它的實際行為,網路上有很多文章介紹這個 rownum的用法,但是很多都講得非常模糊,或者就是不太全面,大家看起來也非常痛苦,在這裡我將給大家全面講解一下,希望對大家有所幫助 首先我們來認識幾點row...