Oracle Rownum工作不正常

Oracle Rownum工作不正常,oracle,rownum,Oracle,Rownum,我有两张桌子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 select * from ( select rownum as rn, A.* from Y as A o

我有两张桌子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
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  Id  name 
1   1   xxx
2   2   yyy
3   4   zzz
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
伪列之前应用
orderby
,以便它们同步:

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

所以我们知道为什么表A的检索顺序与id相同,但表B的检索顺序却不同。因为有两个子查询,性能会下降。@SYMA不,它不会降低性能;您没有更改Oracle正在执行的操作您正在以不同的顺序执行完全相同的操作。好的。。我可以使用行号而不是两个子查询。它会提高性能吗?@SYMA试试看——但我不指望性能会提高;充其量我也会期待同样的表现。