oracle分页查询

为什么基于ROWNUMoracle分页实现,要采用三层嵌套的方式?

1 首先,在没有order by clause的情况下,oracle的查询结果的顺序会是不确定的。如上面的例子。所以order by的使用是应该的,以免因为index等的原因导致不确定的results order

2 其次,在order by ROWNUM同时使用时,oracle默认的策略是先为伪列rownum赋值,再order by

引用

rownumorder by同时存在的问题

where后面有rownum的判断,并且存在order by时候,rownum的优先级高!

  oracle会先执行rownum的判断,然后从结果中order by,很明显是错误的结果啦!就好像学校要取成绩最好的前10名同学,结果这种方法一执行,成了取出10名同学,然后按照成绩的高低排序!

  这点与SQL ServerTOP完全不同,TOP遇上order by,是先执行order by,在分页的;

  解决办法就是先执行order by,然后嵌套执行rownum-----说白啦就是用()改变函数的优先级!

 

所以,第二层嵌套的目的就是:让结果先order by,再取rownum!

3 再次,因为rownum不可使用 >(=)来判断的原因,所以需要最外围的第三层嵌套

SELECT *

  FROM (SELECT *

          FROM (SELECT ROWNUM AS ROW_ID, ORDER_ID

                  FROM ORDERS

                 ORDER BY ORDER_ID DESC) A

         WHERE ROW_ID < 10)

 WHERE ROW_ID >= 5;

 

--上面这样写也是错误的,正如前面的原因,有order byrownum时,先给rownum赋值,然后再对结果进行order by

   所以上面的语句同样是取rownum5--10之间的记录,而不是排好序之后的5--10记录。

正确写法:

SELECT B.ORDER_ID,B.ORDER_DETAILS,B.R_ID

  FROM (SELECT A.ORDER_ID,A.ORDER_DETAILS,ROWNUM AS R_ID     --对排序好的结果取其rownum,再取rownum小于给定值的记录(不能直接对rownum取大于)

          FROM (SELECT ORDER_ID,ORDER_DETAILS      --获取排序好的结果集

                  FROM ORDERS

                 ORDER BY ORDER_ID DESC) A

         WHERE ROWNUM < 10) B

 WHERE R_ID >= 5;                   --R_ID大于给定值的记录

PS: 不能在where语句中使用别名进行过滤(汗一个,看来很多东西需要实践啊。)

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值