• 数据库排序后,分页,导致查询数据丢失


    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。

  • 相关阅读:
    [UVa514] Rails
    今日才真正懂了BFS
    [UVa11292] Dragon of Loowater
    [UVa] TEX Quotes
    白书杂七杂八
    [OpenJudge] Feed_Accounting
    [OpenJudge] Jolly_Jumpers
    Restart
    Collection of Websites
    Oracle11完全卸载方法
  • 原文地址:https://www.cnblogs.com/qjm201000/p/12222632.html
Copyright © 2020-2023  润新知