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和分页的更多相关文章

  1. Oracle rownum 分页, 排序

    Oracle rownum 分页, 排序 什么是rownum, rownum的生成, rownum相关的符号操作 Rownum是oracle生成结果集时得到的一个伪列, 按照读出行的顺序, 第一条ro ...

  2. oracle和mysql分页

    mysql分页 关键字limit,limit m,n 其中m表示起始位置的下标,下标从0开始.n表示要显示的条数,比如要查询一个表的第2到5条数据. ,; oracle分页 关键字rownum, ro ...

  3. oracle入门之分页查询

    oracle的分页查询共三种方法 1.根据ROWID来分页(速率一般) SQL>select * from emp where rowid in (select rid from (select ...

  4. mysql / sqlserver / oracle 常见数据库分页

    空闲时间里用着mysql学习开发测试平台和测试用具, 在公司里将可用的测试平台部署,将数据库换成sqlserver 巴望着能去用oracle的公司 mysql中的分页 limit是mysql的语法se ...

  5. Oracle的查询-分页查询

    --Oracle中的分页 --rownum行号:当我们做select操作时候 --每查询出一行记录,就在该行加上一个行号 --行号从1开始,一次递增,不能跳着走 ----emp表工资倒叙排列后,每页5 ...

  6. 160628、利用Oracle rownum让表排序字段值连续

    利用Oracle rownum让表排序字段值连续 1.需求说明 表(eval_index)中有字段如下: 表字段 描述 说明 ID 主键 GROUP_ID 分组编号 SORT_NUM 排序序号 按照分 ...

  7. Oracle ROWNUM用法和分页查询总结(转)

    [转载] Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用. Oracle分页查询格式(一):http://yangtingkun.itpub.net/post/468/100278 ...

  8. Oracle ROWNUM用法和分页查询总结

    **************************************************************************************************** ...

  9. [转]Oracle ROWNUM用法和分页查询总结

    本文转自:http://blog.csdn.net/fw0124/article/details/42737671 ****************************************** ...

随机推荐

  1. Hyperledger Fabric密码模块系列之BCCSP(五) - 国密算法实现

    Talk is cheap, show me your code. 代码也看了,蛋也扯了,之后总该做点什么.响应国家政策,把我们的国密算法融合进去吧--  先附两张bccsp下国密算法的设计实现图. ...

  2. Java中 接口是如何实现多态的特性的

    Java中多态是个很难理解的概念,但同时又是非常重要的概念,Java三大特性(封装.继承.多态)之一,我们从字面上理解,就是一种类型的多种状态,一下通过卖小汽车的例子再次说明什么是多态,其中利用到了接 ...

  3. 使用git push命令如何忽略不想提交的文件夹或者文件

    如下场景是在window下的操作. 在使用node的时候有个node_modules文件夹很大,一般情况下不想提交,忽略的办法如: 方法一(来自评论区):直接在仓库根目录:执行命令echo 'node ...

  4. SQL Server 连接(内连接,外连接,完全连接,交叉连接,联合)

    1.连接 有时候需要将连个表的数据合并成一个结果集来显示.为了解决这个问题,就需要用到JOIN连接. 2.内部连接 内部连接根据一个或几个共同的字段将记录匹配到一起.内部连接仅仅返回那些存在字段匹配的 ...

  5. Nodejs 和 Electron ubuntu下快速安装

    查找时间管理软件的时候发现了superProductivity这个程序,使用electron进行开发,于是看了一下介绍,手痒了,尝试进行环境搭建,下一步慢慢补齐前端知识吧 nodejs安装 nodej ...

  6. HDU5293(SummerTrainingDay13-B Tree DP + 树状数组 + dfs序)

    Tree chain problem Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  7. inheritCombinedParasitic.js

    // 寄生组合式继承 // 其基本思路是通过借用构造函数来继承属性,通过原型链的混成形式来继承方法,就是为了不必为了子类型的原型去调用父类型的构造函数 function inheritPrototyp ...

  8. linux学习笔记-软件包的相关知识

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 一.软件包种类 1.源码包 源码包即提供源代码的发行包 2.二进制包 二进制包即提供二进制文件的发行包 安装方法查找二进制包官网 ...

  9. js之模态对话框

    目标效果:点击页面按钮,显示模态对话框,在模态对话框里点击取消关闭模式对话框. 效果如下 实现代码如下: <!DOCTYPE html> <html lang="en&qu ...

  10. loj#2002. 「SDOI2017」序列计数(dp 矩阵乘法)

    题意 题目链接 Sol 质数的限制并没有什么卵用,直接容斥一下:答案 = 忽略质数总的方案 - 没有质数的方案 那么直接dp,设\(f[i][j]\)表示到第i个位置,当前和为j的方案数 \(f[i ...