• Oracle分页问题


    今天在公司遇到一个分页查询的bug,查询第一页可以查询到数据,下面也显示的没有问题!查询第二页时,显示已经加载完成,但是页面没有问题!

    通过Debug调试,发现第一页查询到的数据没有问题,第二页时,查不到数据!

    第一页时,控制台打印的sql语句:

    SELECT OBJ_NAME, OBJ_ATTRIBUTE_NAME, ATTRIBUTE_TYPE, DES, STS, PRIORITY 
    FROM 
        ( SELECT m.*,rownum row_id 
           FROM (SELECT OBJ_NAME, OBJ_ATTRIBUTE_NAME, ATTRIBUTE_TYPE, DES, STS, PRIORITY FROM WKF_BUSINESS_CONFIG ) m 
            WHERE rownum >= 1) 
    where row_id < 26 

    第二页时,控制台打印的sql语句:

    SELECT OBJ_NAME, OBJ_ATTRIBUTE_NAME, ATTRIBUTE_TYPE, DES, STS, PRIORITY 
    FROM 
        ( SELECT m.*,rownum row_id 
           FROM (SELECT OBJ_NAME, OBJ_ATTRIBUTE_NAME, ATTRIBUTE_TYPE, DES, STS, PRIORITY FROM WKF_BUSINESS_CONFIG ) m 
            WHERE rownum >= 26) 
    where row_id < 51 

    通过分析和查询oracle分页的知识,发现是SQL语句有问题!

    不能对ROWNUM使用>(大于1的数值)、>=(大于或等于1的数值)、=(大于或等于1的数值),否则无结果
    -- 所以直接用只能从1开始
    -- rownum >10 没有记录,因为第一条不满足去掉的话,第二条的rownum又成了1,所以永远没有满足条件的记录。

    正好,查询第二页的时候,上面的sql语句犯了这个问题!

    既然不能>=(大于或等于1的数值),那我就让rownum<大于1的数!

    SELECT OBJ_NAME, OBJ_ATTRIBUTE_NAME, ATTRIBUTE_TYPE, DES, STS, PRIORITY 
    FROM 
         ( SELECT m.*,rownum row_id 
           FROM 
                (SELECT OBJ_NAME, OBJ_ATTRIBUTE_NAME, ATTRIBUTE_TYPE, DES, STS, PRIORITY 
                 FROM WKF_BUSINESS_CONFIG ) m 
                 WHERE rownum <51) 
    where row_id >= 26 

    将sql语句改成这样时,按照要求可以查询到数据!

    既然遇到了Oracle分页查询的问题,正好复习下Oracle分页的相关知识!

    在Mysql中,分页查询很简单!    分页查询使用的是limit关键字进行查询。它后面有两个参数

    第一个参数是起始的位置,第二个参数是每页需要显示的条目数。

    举例:商品表中有10条记录,现在需要进行分页显示,每页显示3条数据。现在需要查看第二页的数据。那么应该使用的sql语句是:

        select * from product limit 3,3;                     第一个参数计算的公式为:(查询的页数-1)*每页显示条目数    即 (2-1)*3=3

    在Oracle中分页就没有那么简单!Oracle中是通过rownum实现分页查询的!

    不能对ROWNUM使用>(大于1的数值)、>=(大于或等于1的数值)、=(大于或等于1的数值),否则无结果
    所以直接用只能从1开始
    rownum >10 没有记录,因为第一条不满足去掉的话,第二条的rownum又成了1,所以永远没有满足条件的记录
    select * from student where rownum>=1;

    如果想要用rownum不从1开始,需按下面方法使用
    select a1.* from (select student.*,rownum rn from student) a1 where rn >5

    分页查询一
    select * from (select a1.*,rownum rn from (select * from student) a1 where rownum <=5) where rn>=2;

    分页查询二
    select a1.* from (select student.*,rownum rn from student where rownum <=5) a1 where rn >=3;

    分页查询三
    select a1.* from (select student.*,rownum rn from student) a1 where rn between 3 and 5;

     

  • 相关阅读:
    Vue项目碰到"‘webpack-dev-server’不是内部或外部命令,也不是可运行的程序或批处理文件"报错
    PowerDesigner最基础的使用方法入门学习
    Centos7 上安装mysql遇上的问题:mysql无法正常启动
    微信小程序的Web API接口设计及常见接口实现
    模型数据作渲染优化时遇到的问题
    vertex compression所遇到的问题
    depth and distance
    Linear or non-linear shadow maps?
    实施vertex compression所遇到的各种问题和解决办法
    【转】編譯Ogre1.9 IOS Dependencies及Ogre Source步驟及相關注意事項…
  • 原文地址:https://www.cnblogs.com/guodong-wang/p/8124352.html
Copyright © 2020-2023  润新知