oracle分页查询

来源:互联网 发布:js查找字符串中字符 编辑:程序博客网 时间:2024/06/16 19:19

为什么基于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语句中使用别名进行过滤(汗一个,看来很多东西需要实践啊。)

 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 百度云上传文件和谐怎么办 收货地址写错了怎么办 阿里巴巴国际版出现加密令牌怎么办 淘宝寄货到转运仓拒收怎么办 淘宝已发货买家申请退货怎么办 买家给了一个差评不接电话怎么办 卖家单号填错了怎么办 拼多多虚假发货买家怎么办 买家退款后又收到货怎么办 买家确认收货已超时怎么办 淘宝买家不确认收货怎么办 买家快递单号填错怎么办 买家不确认收货不评价怎么办 淘宝不给改地址怎么办 淘宝快递发货后申请退款怎么办 摄影公司收钱后跑了怎么办 淘宝上申请退款卖家不处理怎么办 淘宝买东西商家发错货退回怎么办 假模特头头发毛燥怎么办 投资了网上融资平台被骗怎么办 微信被覆盖了怎么办 微信号被覆盖了怎么办 样品鞋子在灯光下变黄怎么办 美图秀秀拼图后发朋友圈模糊怎么办 手机重开淘宝网店怎么办 淘宝店铺下架了怎么办 淘宝东西下架了怎么办 淘宝衣服下架了怎么办 淘宝物品下架了怎么办 淘宝货品下架了怎么办 淘宝cmcc下架了怎么办 修手机主板被换怎么办 换手机屏幕被调换零件怎么办 买了东西想退换怎么办 淘宝退货卖家不同意怎么办 淘宝退货退错了怎么办 商品质量问题换货后仍有问题怎么办 货没收到想退款怎么办 淘宝退货店家不退款怎么办 京东退货快递显示签收怎么办 买家已付款卖家不发货怎么办