[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 ****************************************** ...
随机推荐
- C语言之链表的使用
C语言链表初学者都说很难,今天就来为大家讲讲链表 讲链表之前不得不介绍一下结构体,在链表学习之前大家都应该已经学了结构体,都知道结构体里面能有许多变量,每个变量可以当做这个结构体的属性,例如: str ...
- ASP.NET上传时间超过4M失败(超时)的解决方法
https://blog.csdn.net/shan1774965666/article/details/20836851 在web.config中的<system.web></sy ...
- razor视图使用三元表达式
根据条件是否满足给input标签添加属性. <input type="radio" value="1" name="PortType" ...
- linux下如何批量杀JAVA进程或某个进程方法
linux下如何批量杀JAVA进程或某个进程方法 在工作中经常需要停止JAVA进程,停止时间也比较长,那么有时候因为一些情况,需要把 linux 下JAVA所有进程 kill 掉,又不能用killal ...
- [PHP] 数据结构-链表创建-插入-删除-查找的PHP实现
链表获取元素1.声明结点p指向链表第一个结点,j初始化1开始2.j<i,p指向下一结点,因为此时p是指向的p的next,因此不需要等于3.如果到末尾了,p还为null,就是没有查找到 插入元素1 ...
- Linux常用基本命令:三剑客命令之-awk基础用法
awk是一个超级强大的文本格式化处理工具,他与grep, sed命令被成为linux 三剑客命令 三剑客命令的特点: grep:只要用来匹配和查找文本 sed: 编辑匹配到文本 awk: 格式化文本, ...
- inheritConstructorStealing.js
// 借用构造函数 // 其基本思路是在子类型构造函数的内部调用父类型的构造函数 function Person(name){ this.name = name; this.friends = [&q ...
- 从零开始学习html(五)与浏览者交互,表单标签——下
六.使用下拉列表框进行多选 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type ...
- rem与px之间的换算(移动端)
最近因为工作接触到rem与px之间的换算,之前知道一些,不过还是比较笼统模糊,用起来不是很明白,后来自己查了点资料,以及亲自测试总算明白它们之间是怎么换算的了. rem是一个相对值,它相对于根元素ht ...
- html学习笔记——ife task0001
花了两三天大概看完html和css基本用法,但到自己布局的时候还是很懵不知道从哪里入手啊,就找了个简单的任务(ife2015 spring)试一下. 之前不涉及到布局的跳过,从涉及到position和 ...