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