數據庫排序后,分頁,導致查詢數據丟失


sql如下:

select *
from (

select tmp_page.*, rownum row_id
from (
    select 
    d.CHECK_TIME 
    d.CAR_NO carNo,
    from aaa d
    order by d.CHECK_TIME desc
) tmp_page where rownum <= 20
) where row_id > 0

 

問題排查步驟:
1.查看sql:

select 
    d.CHECK_TIME 
    d.CAR_NO carNo,
    rownum
    from aaa d
    order by d.CHECK_TIME desc

 

select tmp_page.*, rownum row_id
from (
    select 
    d.CHECK_TIME 
    d.CAR_NO carNo,
    rownum
    from aaa d
    order by d.CHECK_TIME desc
) tmp_page
where rownum <= 20

  發現兩次的rownum結果不同,經分析,CHECK_TIME的數據內容格式:YYYYMMDDHH,不能保證排序的唯一性,導致了可能數據會丟失現象。

 

解決方案: order by d.CHECK_TIME desc,d.pk desc, pk能保證排序的唯一性。
如果沒有主鍵pk,可以用 order by d.CHECK_TIME desc,d.ROWID desc  保證排序的唯一性。

總結:只要order by之后的字段能保證排序唯一性,就不會出現問題。比如order by pk,就不會有問題;或者組合的order by,只要能保證唯一就OK。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM