如题: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 = 11
最终一样的效果。