oracle 数据库分页中的order by 后数据重复问题

  • 原创
  • |
  • 浏览:3441
  • |
  • 更新:

在开发系统软件时,经常会使用oracle数据库分页,但是最近发现组装的分页sql没有问题,但是每次点下一页显示数据都一样,本文简要介绍此问题的解决思路。

工具/原料

  • oracle数据库
  • plsql软件 工具

方法/步骤

  1. 1
    我的分页sql如下所示:

    select * from(

      select rownum rowno,tt.* from(

        select a.* from ... a

             where ....

            ordery by ...,lrsj

      ) tt where rownum<=n1

      ) table_alias where table_alias.rowno>n2

    在查询过程中n1,n2,配置20、11,30、21,40、31时,查询出的数据重复

    oracle 数据库分页中的order by 后数据重复问题
    oracle 数据库分页中的order by 后数据重复问题
  2. 2

    经过分析发现,根据jgdm排序后,当jgdm相同的数据有很多个时,并没有给它一个排序规则,也就是说不能保证每次分页查询时的记录的rownum一致。因此得到的数据也不是我们预想的,经测试的确如此。

  3. 3

    因此,对于此问题的解决方法如下:

    第一种:修改select 语句后的order by 字段,使排序规则有效,比如,首先按机构、然后按主键或者不加排序子句,或者干脆按rowid排序都是可以的,不过后者也就没有什么业务含义了。

    由于是生产环境,不便于修改程序,因此我没有采用此方法解决。

  4. 4

    第二种方法:修改排序字段的数据内容。

    由于排序字段数据重复,导致排序结果无规则,而抱着先解决问题的态度,我就先修改数据内容,使期排序有效。这里也是有技巧的,比如怎么修改lrsj字段值保证排序有效,而又不用使时间字段变化太多呢?

    我的做法是,lrsj=lrsj+rownum/24/60/60,也就是按行号增加1秒。

    sql如下:

    update ... a

        set a.lrsj=(select b.lrsj+rn/24/60/60

                         from(select a.rowid rid,rownum rn,a.* from ... a) b

                     where a.rowid=b.rid )

    oracle 数据库分页中的order by 后数据重复问题
  5. 5

    经过修改后,分页查询数据显示正常,不再出现重复值了。

    END
  6. 5
    相关内容未经授权抓取自百度经验

注意事项

  • 看来以后使用分页sql时,增加排序时一定要注意一下了。
经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。
作者声明:本篇经验系本人依照真实经历原创,未经许可,谢绝转载。
展开阅读全部