使用rownum进行分页查询的注意事项

参考:http://www.cnblogs.com/mabaishui/archive/2009/10/20/1587165.html

1.首先rownum是基于结果集进行编号的。。

2.ROWNUM是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则rownum值为1,第二条为2,依次类推。如 果你用>,>=,=,between……and这些条件,因为从缓冲区或数据文件中得到的第一条记录的rownum为1,则被删除,接着取下 条,可是它的rownum还是1,又被删除,依次类推,便没有了数据。

3.列如:select se.*,rownum ro from scott.emp se where ro>5;

从emp表中,取出第一条记录,结果集中现在为空,rownum根据结果集,给它编号1,然后进行条件判断,不满足,丢掉。取出第二条记录,编号为1.。。。。

所以没有一条记录满足条件,自然查询结果为空了。。。

4.解决方法:

  1.使用子查询和rownum,先将rownum的结果固定,再进行查询

  2.通过子查询和row_number,进行分页查询

  列题:--获取薪水从高到低排序的第5到9条记录

      --通过rownum实现
            --从高到低排序
            select * from scott.emp order by sal desc
            --编号
            select rownum ro,se.* from (select * from scott.emp order by sal desc) se
            --取出第5到9条记录
            select * from (select rownum ro,se.* from (select * from scott.emp order by sal desc) se)
            where ro>=5 and ro <=9;
            
      --通过分析函数row_number来分页
            select * from
            (select row_number() over (order by sal) as rn,se.* from scott.emp se) se2
            where se2.rn>=5 and se2.rn<=9;

posted on 2016-08-18 17:11  樱落霜哀  阅读(1812)  评论(0)    收藏  举报

导航