Oracle分页:rownum从1开始查询没有问题,下一页出现问题

如题:Oracle分页查询在rownum从1开始可以查出数据,但是从其他数字开始就不能查出数据。

如图:rownum从1到10:


但是rownum 从11到20就不能查出数据(实际数据大于11):

原因分析:

    rownum总是从1开始的,第一条不满足去掉的话,第二条的rownum 又成了1。依此类推,所以永远没有满足条件的记录。

 可以这样理解:rownum是一个序列,是Oracle数据库从数据文件或缓冲区中读取数据的顺序。 它取得第一条记录则rownum值为1,第二条为2。依次类推。

    当使用“>、>=、=、between...and”这些条件时,从缓冲区或数据文件中得到的第一条记录的rownum为1,不符合sql语句的条件,会被删除,接着取下条。下条的rownum还会是1,又被删除,依次类推,便没有了数据。

修正方案:

    嵌套外层查询:

select * from (
select rownum as rn,t.* from com_user t 
)where 1=1 and rn between 11 and 20

效果如下:

备注:上面的查询方法比较容易写,但是效率稍微差一点,效率高的查询方法是:

上限条件必须放在子查询,而下限条件必须放在外层查询。

select *
  from (select rownum as rn, t.* from com_user t where rownum <= 20)
 where 1 = 1
   and rn >= 11
最终一样的效果。

猜你喜欢

转载自blog.csdn.net/iilegend/article/details/80802218