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序号是乱的哈): 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韦_恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值