Oracle分页问题

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

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

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

 

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语句有问题!code

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

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

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

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语句改为这样时,按照要求能够查询到数据!select

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

在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;

相关文章
相关标签/搜索