oracle 中使用 rownum 的一个误区

一、首先看一个简单的测试

(1)创建一个简单的 TEST 表,里面插入 1-9 条数据:


(2)按照 status 字段进行排序,得到的结果:


(3)使用 rownum 取前 5 条结果:


二、测试中的两个问题

(1)上面第二步中,select 出来的结果,第 5 条记录的 userId 不是 5,而是 9

原因:oracle 使用了不稳定排序算法(即排序字段相同时,结果集不能保持原数据顺序)


(2)上面第三步中,select 出来的结果,第 5 条记录的 userId 不是 9,而是 5

原因:oracle 执行这个 sql 时,所用排序算法与第二步所用的排序算法不一样

误区:误以为 oracle 先执行了第二步的 sql,然后直接取出前 5 条数据

实际上,oracle 执行这个 sql 的步骤是这样子的:

1. 取出前 5 条数据进行排序

2. 取出第 6 条数据,与前 5 条数据一起再排序。排序后,取前 5 条数据,丢弃最后一条数据

3. 取出第 7 条数据,与前 5 条数据一起再排序。排序后,取前 5 条数据,丢弃最后一条数据

4. ...

5. 取出第 9 条数据,与前 5 条数据一起再排序。排序后,取前 5 条数据,作为结果集


参见:http://www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197.html

原文片段:



ps:我遇到的实际问题是,分页查询数据,查到某一页之后,后面每一页的内容都是一样的

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值