[Oracle] ROWNUM和分页
rownum是oracle的一个伪劣,它的顺序依据从表中获取记录的顺序递增,这里要注意的是:由于记录在表中是无序存放的。因此你无法通过简单的rownum和order by的组合获得相似TOP N的结果。
我们的測试数据例如以下:
select * from test;
ID NAME
---------- --------------------
1 A
3 C
4 C
8 C
10 D
2 B
5 C
7 C
6 C
9 D
通过rownum<=5能够获得前5行数据:
select * from test where rownum<=5;
ID NAME
---------- --------------------
1 A
3 C
4 C
8 C
10 D
假设你想获得像top n那样的结果。必须使用子查询:
select * from (select * from test order by id) where rownum<=5;
ID NAME
---------- --------------------
1 A
2 B
3 C
4 C
5 C
假设你想获得第5行到第10行之间的数据,则必须再加一层子查询:
select T.* from (select t.*,rownum rn from (select * from test order by id) t where rownum<=10) T where T.rn>5;
ID NAME RN
---------- -------------------- ----------
6 C 6
7 C 7
8 C 8
9 D 9
10 D 10
事实上上面的写法是由陷阱的。不信你把order by id换成order by name试试看:
select * from (select * from test order by name) where rownum<=5;
ID NAME
---------- --------------------
1 A
2 B
3 C
4 C
8 C
select T.* from (select t.*,rownum rn from (select * from test order by name) t where rownum<=10) T where T.rn>5;
ID NAME RN
---------- -------------------- ----------
5 C 6
4 C 7
8 C 8
10 D 9
9 D 10
你会惊奇的发现id=4这条数据出如今了两个地方,这不合逻辑!但事实就是这种,为什么呢?由于name不唯一,两次排序取出的结果有可能会不一样,我还是举个样例吧:
select id,name,rank() over(order by name) from test;
ID NAME RANK()OVER(ORDERBYNAME)
---------- -------------------- -----------------------
1 A 1
2 B 2
6 C 3
3 C 3
4 C 3
8 C 3
5 C 3
7 C 3
9 D 9
10 D 9
从上面的结果我们不难发现。依据name排序,有多条数据并列排在第3位。这样。当取前5名时,究竟在并列第3中取哪几位就不是确定的事。因此就出现了之前出现的诡异的问题。那么,如何才干彻底解决问题呢?事实上仅仅要在order by name后面加上rowid,保证不会出现并列的情况就能够了,例如以下所看到的:
select * from (select * from test order by name,rowid) where rownum<=5;
ID NAME
---------- --------------------
1 A
2 B
3 C
4 C
8 C
select T.* from (select t.*,rownum rn from (select * from test order by name,rowid) t where rownum<=10) T where T.rn>5;
ID NAME RN
---------- -------------------- ----------
5 C 6
7 C 7
6 C 8
10 D 9
9 D 10
[Oracle] ROWNUM和分页的更多相关文章
- Oracle rownum 分页, 排序
Oracle rownum 分页, 排序 什么是rownum, rownum的生成, rownum相关的符号操作 Rownum是oracle生成结果集时得到的一个伪列, 按照读出行的顺序, 第一条ro ...
- oracle和mysql分页
mysql分页 关键字limit,limit m,n 其中m表示起始位置的下标,下标从0开始.n表示要显示的条数,比如要查询一个表的第2到5条数据. ,; oracle分页 关键字rownum, ro ...
- oracle入门之分页查询
oracle的分页查询共三种方法 1.根据ROWID来分页(速率一般) SQL>select * from emp where rowid in (select rid from (select ...
- mysql / sqlserver / oracle 常见数据库分页
空闲时间里用着mysql学习开发测试平台和测试用具, 在公司里将可用的测试平台部署,将数据库换成sqlserver 巴望着能去用oracle的公司 mysql中的分页 limit是mysql的语法se ...
- Oracle的查询-分页查询
--Oracle中的分页 --rownum行号:当我们做select操作时候 --每查询出一行记录,就在该行加上一个行号 --行号从1开始,一次递增,不能跳着走 ----emp表工资倒叙排列后,每页5 ...
- 160628、利用Oracle rownum让表排序字段值连续
利用Oracle rownum让表排序字段值连续 1.需求说明 表(eval_index)中有字段如下: 表字段 描述 说明 ID 主键 GROUP_ID 分组编号 SORT_NUM 排序序号 按照分 ...
- Oracle ROWNUM用法和分页查询总结(转)
[转载] Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用. Oracle分页查询格式(一):http://yangtingkun.itpub.net/post/468/100278 ...
- Oracle ROWNUM用法和分页查询总结
**************************************************************************************************** ...
- [转]Oracle ROWNUM用法和分页查询总结
本文转自:http://blog.csdn.net/fw0124/article/details/42737671 ****************************************** ...
随机推荐
- Hyperledger Fabric密码模块系列之BCCSP(五) - 国密算法实现
Talk is cheap, show me your code. 代码也看了,蛋也扯了,之后总该做点什么.响应国家政策,把我们的国密算法融合进去吧-- 先附两张bccsp下国密算法的设计实现图. ...
- Java中 接口是如何实现多态的特性的
Java中多态是个很难理解的概念,但同时又是非常重要的概念,Java三大特性(封装.继承.多态)之一,我们从字面上理解,就是一种类型的多种状态,一下通过卖小汽车的例子再次说明什么是多态,其中利用到了接 ...
- 使用git push命令如何忽略不想提交的文件夹或者文件
如下场景是在window下的操作. 在使用node的时候有个node_modules文件夹很大,一般情况下不想提交,忽略的办法如: 方法一(来自评论区):直接在仓库根目录:执行命令echo 'node ...
- SQL Server 连接(内连接,外连接,完全连接,交叉连接,联合)
1.连接 有时候需要将连个表的数据合并成一个结果集来显示.为了解决这个问题,就需要用到JOIN连接. 2.内部连接 内部连接根据一个或几个共同的字段将记录匹配到一起.内部连接仅仅返回那些存在字段匹配的 ...
- Nodejs 和 Electron ubuntu下快速安装
查找时间管理软件的时候发现了superProductivity这个程序,使用electron进行开发,于是看了一下介绍,手痒了,尝试进行环境搭建,下一步慢慢补齐前端知识吧 nodejs安装 nodej ...
- HDU5293(SummerTrainingDay13-B Tree DP + 树状数组 + dfs序)
Tree chain problem Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- inheritCombinedParasitic.js
// 寄生组合式继承 // 其基本思路是通过借用构造函数来继承属性,通过原型链的混成形式来继承方法,就是为了不必为了子类型的原型去调用父类型的构造函数 function inheritPrototyp ...
- linux学习笔记-软件包的相关知识
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 一.软件包种类 1.源码包 源码包即提供源代码的发行包 2.二进制包 二进制包即提供二进制文件的发行包 安装方法查找二进制包官网 ...
- js之模态对话框
目标效果:点击页面按钮,显示模态对话框,在模态对话框里点击取消关闭模式对话框. 效果如下 实现代码如下: <!DOCTYPE html> <html lang="en&qu ...
- loj#2002. 「SDOI2017」序列计数(dp 矩阵乘法)
题意 题目链接 Sol 质数的限制并没有什么卵用,直接容斥一下:答案 = 忽略质数总的方案 - 没有质数的方案 那么直接dp,设\(f[i][j]\)表示到第i个位置,当前和为j的方案数 \(f[i ...