Oracle Rownum工作不正常
我有两张桌子X和Y。 当我在下面运行表X的查询时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
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试试看——但我不指望性能会提高;充其量我也会期待同样的表现。