Oracle 分页查询 为什么需要嵌套
来源:互联网 发布:react dom.js下载 编辑:程序博客网 时间:2024/06/05 09:38
为什么基于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_ID FROM ORDERS ORDER BY ORDER_ID DESC) A WHERE 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_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语句中使用别名进行过滤(汗一个,看来很多东西需要实践啊。)
- Oracle 分页查询 为什么需要嵌套
- oracle 三层嵌套分页查询
- oracle三层嵌套分页
- oracle嵌套查询
- oracle 嵌套查询
- oracle Oracle分页查询
- oracle子查询嵌套查询
- oracle 数据分页查询
- Oracle分页查询语句
- oracle分页查询
- Oracle分页查询语句
- Oracle分页查询语句
- Oracle分页查询语句
- Oracle的分页查询
- oracle分页查询
- Oracle分页查询
- oracle 分页查询
- Oracle的分页查询
- 浏览器性能评测报告(四):评测数据
- 【object-c基础】Object-c基础之一:#import,NSLog(),数据类型
- 获取IE (控件)的所有链接(包括Frameset, iframe)zz
- android NDK 使用第三方静态库
- 软盘与FAT12文件系统的组织格式
- Oracle 分页查询 为什么需要嵌套
- 别迷失在“成功故事”中
- SQL注入攻击三部曲之高级篇
- asp.net HttpModule类
- struts2 动态方法调用 感叹号
- gvim 使用技巧
- 【object-c基础】object-c基础之二:property,assign,copy,retain,release
- 重要的东西
- 我们生活的时代