罗纳姆无法正常工作



我有两个表X和Y。 当我在下面查询表 X 时

select * from 
( select rownum as rn, A.* from X as A order by A.IDdesc) where rn between 0 
and 1000000;

我得到的结果为

rn  Id  name 
1   1   xxx
2   2   yyy
3   4   zzz

但是对于 Y 表,当执行相同的查询时,我得到的结果为

select * from 
( select rownum as rn, A.* from Y as A order by A.IDdesc) where rn between 0 
and 1000000;
rn  Id  name 
5   1   xxx
7   2   yyy
10  4   zzz

Y 表中的 rn 正在获取一些随机数。无法理解此行为。纽约的帮助将不胜感激。

ROWNUM伪列将按照 Oracle 检索行的顺序添加到选定的列中,然后应用ORDER BY子句。您似乎想要的是先对行进行排序,然后根据此顺序生成ROWNUM,但这不是您的查询将要执行的操作。

对于表 X,Oracle 检索行的顺序与id列的顺序相同。但是,对于表 Y,行的检索顺序与id列的顺序不同,因此ROWNUM按检索行的顺序排列,然后应用不同的顺序,以便ROWNUM值显示为随机排列。

您应该做的是在生成ROWNUM伪列之前应用ORDER BY,以便它们同步:

SELECT *
FROM   (
SELECT rownum as rn,
A.*
FROM   (
SELECT *
FROM   X
ORDER BY ID desc
) A
)
WHERE  rn BETWEEN 0 AND 1000000;

最新更新