Oracle ROWNUM分页编号问题

Oracle ROWNUM pagination numbering problem

我在对列进行排序和分页时遇到了一些问题。

例如,

select *
from
    (select A.*, ROWNUM RNUM
         from 
        (select * from USER order by name) A
        where ROWNUM <= 3 --edited
    ) B
    where RNUM >= 1

作为 A

select *
from
    (select A.*, ROWNUM RNUM
         from 
        (select * from USER order by name) A
        where ROWNUM <= 4 --edited
    ) B
    where RNUM >= 1

作为 B

两者的区别在于columns rownums。 我想知道为什么会这样。


一个returns,

RNUM | NAME
-----------
1    | a
-----------
2    | b
-----------
3    | c

B returns.

RNUM | NAME
-----------
1    | a
-----------
2    | f     -- what happened?
-----------
3    | b
-----------
4    | c

这只是一个例子。

为什么每列由于行数的范围而得到不同的行数?

为什么发生了什么

  • 来源是 select * from user(显然,假的 table 名称;这是为 returns 当前登录的 用户的用户名 保留的功能)所以它从 table
  • 中选择 all rows
  • rownum rnum 然后反映从 table、one-by-one 返回的所有行数,从 1 到 table
  • 中的总行数
  • where rownum <= 10 将源子查询返回的行数限制为 10(第一个示例)/200(第二个示例)。代表着
    • 第一个查询最多处理 10 行
    • 第二个查询最多处理 200 行
  • 最终过滤器 (where rnum >= 1) returns 之前所说的 - 最多 10(或 200)行

所以...有什么问题?你期望得到什么?


根据您的评论:似乎缺少 order by 子句:

select *
from
    (select A.*, ROWNUM RNUM
         from 
        (select * from USER order by name) A
        where ROWNUM <= 10
        order by a.name                 --> this
    ) B
    where RNUM >= 1