oracle 中使用 rownum 的一个误区

来源:互联网 发布:北京网络策划公司 编辑:程序博客网 时间:2024/05/23 10:18

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

(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:我遇到的实际问题是,分页查询数据,查到某一页之后,后面每一页的内容都是一样的

0 0