我有两个表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;