Oracle数据库ROWNUM进行分页查询的方法及注意事项

在oracle数据库中分页查询与sqlserver方式是不大一样的,当然分页思想是一样的,这里记录下第一次用oracle分页查询的总结。


oracle提供了一个rownum用来记录行号【ROWNUM是一个序列,会根据sql语句自动给你加上一列排好顺序的序号列】,这样我们就可以通过这个列的数值进行分页,每次只查询指定范围的内容。

注意:

ROWNUM针对的是查询出来的结果进行的编号的。也就是说一定要先有查询结果集,ROWNUM是对结果集加的一个伪列,即先查到结果集后给结果集又加上去了一个列。所以一定要用一个嵌套方式将“查询结果”和“根据结果rownum分页”分开进行。

典型错误用法:

select g.* from grade g where rownum > 10 order by chinese;

这么查询是没有结果的,这又涉及到了rownum的查询方式。rownum是对符合条件的结果进行查询这点没毛病,但是他总是从1开始排起的,即第一条记录rownum=1,第二条记录rownum=2依次类推。所以你选出的结果不可能没有1,而有其他大于1的值。所以当你直接rownum > 10的时候,从缓冲区或数据文件中得到的第一条记录为rownum=1不符合要求被删除,继续取下一条,rownum还是从1开始(rownum=1),所以你就一直取不到。【>,>=,=,between....and....一样存在这个问题】。

解决办法:我们先查询出结果集,之后再利用rownum就好了。

正确用法:

select MyGrade.*

     from (select G.*, rownum rn from (select g.* from grade g order by chinese) G ) MyGrade

 where MyGrade.rn >= 10

如下:我写的一个分页(现在是第一页),内部查询条件是时间+数据类型筛选,查询出结果集后再针对rownum进行分页就可以使用>号了,最后加了一个根据时间排序。

--分页(用rownum去查)
select * from(select ROWNUM rn,logid, ltime, lperson, loperation, ldatatype, lstatus from(
    select * from SDE.LOGS  where LTIME>=to_date('2020-02-01','yyyy-mm-dd') and  LTIME<=to_date('2020/09/02','yyyy-mm-dd') and LDATATYPE='矢量数据')
)where rn>(1-1)*15 and rn <=(1*15) order by LTIME DESC;

结果(因为结尾加了个根据时间倒序排序,所以RN序号是乱的哈): 

 

猜你喜欢

转载自blog.csdn.net/qq_42539194/article/details/108440823
今日推荐