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
我在对列进行排序和分页时遇到了一些问题。
例如,
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