select t2.* from      --两层嵌套  (select t.* , rownum as row_numfrom t where rownum <=20) t2  where t2.row_num > 11

select t3.* from (      --三层嵌套
select t2.*, rownum as row_num from (
select * from t
) t2 where rownum<=20
) t3 
where t2.row_num>11

两层嵌套  ==三层嵌套???


1 select t2.* from (
2   select t.*, rownum as row_num from t where rownum<=20 order by ID asc
3 ) t2 where t2.row_num>10
4
5 order by ID asc 

因为在查询的时候,order by 的执行是在 select 之后的,所以在第一层查询中,得到的结果可能是如下

ID   row_num

1        3

8        20

20      4

21      1

...

100    8

===20条记录,其中row_num字段的值在1-20

这样的子结果集,在经过第二层过滤的时候,是得不到我们想要的结果的

ID

11

12

13

...

20

所以需要用如下的sql语句实现分页排序

1 select t3.* from (
2   select t2.*, rownum as row_num from (
3      select * from t order by t.id asc
4   ) t2 where rownum<=20
5 ) t3
6 where t2.row_num>11
7 order by t3.id asc  

为什么基于ROWNUM的oracle分页实现,要采用三层嵌套的方式?
1 首先,在没有order by clause的情况下,oracle的查询结果的顺序会是不确定的。如上面的例子。所以order by的使用是应该的,以免因为index等的原因导致不确定的results order。
2 其次,在order by 和 ROWNUM同时使用时,oracle默认的策略是先为伪列rownum赋值,再order by。
引用
rownum与order by同时存在的问题
当 where 后面有rownum的判断,并且存在order by时候,rownum的优先级高! oracle会先执行rownum的判断,然后从结果中order by,很明显是错误的结果啦!就好像学校要取成绩最好的前10名同学,结果这种方法一执行,成了取出10名同学,然后按照成绩的高低排序! 这点与SQL Server的TOP完全不同,TOP遇上order by,是先执行order by,在分页的; 解决办法就是先执行order by,然后嵌套执行rownum-----说白啦就是用()改变函数的优先级!所以,第二层嵌套的目的就是:让结果先order by,再取rownum!
3 再次,因为rownum不可使用 >(=) 来判断的原因,所以需要最外围的第三层嵌套
SELECT *FROM (SELECT *FROM (SELECT ROWNUM AS ROW_ID, ORDER_IDFROM ORDERSORDER BY ORDER_ID DESC) AWHERE ROW_ID < 10)WHERE ROW_ID >= 5;--上面这样写也是错误的,正如前面的原因,有order by 和rownum时,先给rownum赋值,然后再对结果进行order by,所以上面的语句同样是取rownum为5--10之间的记录,而不是排好序之后的5--10记录。
正确写法:
SELECT B.ORDER_ID,B.ORDER_DETAILS,B.R_IDFROM (SELECT A.ORDER_ID,A.ORDER_DETAILS,ROWNUM AS R_ID      --对排序好的结果取其rownum,再取rownum 小于给定值的记录(不能直接对rownum取大于)FROM (SELECT ORDER_ID,ORDER_DETAILS       --获取排序好的结果集FROM ORDERSORDER BY ORDER_ID DESC) AWHERE ROWNUM < 10) BWHERE R_ID >= 5;                    --取R_ID大于给定值的记录
PS: 不能在where语句中使用别名进行过滤(汗一个,看来很多东西需要实践啊。)

http://www.cnblogs.com/binblog/archive/2012/01/02/2309991.html

http://www.xuebuyuan.com/1292664.html

转载于:https://www.cnblogs.com/wincai/p/5506053.html

[转]oracle分页用两层循环还是三层循环?相关推荐

  1. [云计算]两层网络、三层网络的理解

    最近参与一个华为HCS云平台的规划设计,主要是辅助角色.过往的经验中,对于网络知识理论学得多,实践比较少,借此项目从新学习了相关的网络知识.本文转自两层网络.三层网络的理解_cj2580的博客-CSD ...

  2. for循环里面嵌套if_信不信两层python嵌套for循环就能把你搞懵了

    1. 相加为10的组合 任何一门编程语言的基础部分都很容易学习,初学者似乎阅读一遍教程就能够掌握,但这种掌握仅仅停留在理解上,而非运用上,下面是一个简单的两层嵌套for循环,如果你对for循环的理解和 ...

  3. 两层网络,三层网络的理解

    对于搞IT的同行而言,大部分人都不会直接和网络打交道,因此除非从事网络开发,否则对网络内部机制也不会太关心,但是明白网络数据是怎么走的,这对每个IT工程师应该是很重要的基础知识.网络数据包如何在网络上 ...

  4. java 两层while_java – while while循环满足2个条件之一

    我正在尝试使用do while循环来确定用户是否想要将狗或猫检入 Java中的狗窝系统.这个想法是他们在提示时输入"dog"或"cat",任何条目都会导致错误, ...

  5. break 跳出两层甚至多层 for 循环

    这个小技巧我用了很久了,我以为普普通通应该大家都这么用吧,直到前段时间我看到还有人写这样的教程,用什么 goto 等等一些花里胡哨的操作,感觉问题还是没有得到很好的解决,所以我决定写这篇文章,不描述了 ...

  6. 两矩阵相乘之三层循环问题

    矩阵A:SIZE_M*SIZE_N   矩阵B:SIZE_N*SIZE_S 结果矩阵C:SIZE_M*SIZE_S for(int m=0;m<SIZE_M;m++) {for(int s=0; ...

  7. 函数 —— strtok() 例如:Fred male 25,John male 62,Anna female 16两层循环

    //char *strtok(char *str, const char *delim) /*功能:  * 函数用来将字符串分割成一个个片段*/ /*参数:  * str -- 要被分解成一组小字符串 ...

  8. Mybatis中mapper文件中的两层循环

    导言 使用mapper.xml文件来存储和执行sql语句是Mybatis框架中重要的应用.在mapper.xml文件中对List数据的循环遍历较为普遍和常用,而两层或多层循环是大家不常用的.下面简单介 ...

  9. 都是❤️两层循环❤️的冒泡排序,选择排序,插入排序该怎么区分

    目录 冒泡排序 选择排序 插入排序 这三个排序都有两层循环这是他们表面的特点,我把外部循环叫大循环,内部循环叫小循环,他们算法根本思想都有相同点,就是将待排序序列分为无序区间和有序区间,每过一次大循环 ...

最新文章

  1. c语言程序设计歌手大奖赛,C语言二维数组怎么做:设计青年歌手参加歌曲大奖赛计分系统: 共...,怎样用c语言程序设计? 青年歌手参加歌曲大奖赛,有10个评委...
  2. Django models Form model_form 关系及区别
  3. 详解图像直方图均衡化原理,附MATLAB、C、C++源码
  4. iOS开发工具——网络封包分析工具Charles
  5. 根据端口不同来切换站点_KVM切换器是什么,看懂这一篇就够
  6. vue 限制输入字符长度
  7. 动画学习android,Android动画学习
  8. display:inline-block 间隙
  9. 全是宝!20款优质高效的在线协作工具任你挑,就是这么强大!
  10. 复杂性,科学,方法论?
  11. ZIP:ZipEntry
  12. 米家扫地机器人是石头代工_石头扫地机器人T4全面评测 支持软件虚拟墙,清扫更高效...
  13. 【LDO带载能力和两端压差有关】
  14. 生信分析用python还是r_生信分析利器:JupyterLab
  15. 豆瓣上的一条关于泰坦尼克的影评5
  16. 共享个人整理的Python问题,有源码,分析过程,解决方案,还有时间戳做间隔
  17. VM是什么,干什么的
  18. OpenStack实操用到的网络知识
  19. 业界天花板 | 四度入围Gartner全球《数据防泄露市场指南》
  20. 关于优化公式的小白理解

热门文章

  1. element 输入框点击事件_Element Input输入框的使用方法
  2. vscode设置templates_Vscode中快速创建自定义代码模板的方法
  3. 【CCCC】L2-024 部落 (25分),,并查集,模板水题,统计集合个数
  4. 【网络安全】从零开始的CTF生活
  5. 【编辑器】用CodeRunner打造VScode的C++开发环境
  6. 合并多个txt文件到一个
  7. 【Python3】py脚本打包成exe
  8. 根据需求增加或删除表格行
  9. html 列导航包括导航,在HTML5中,主导航应该在元素内部还是外部?
  10. android 内存分析工具_Android Camera内存问题剖析