Rownum工作不正常
Rownum工作不正常
我有两个表X和Y。\n当我对表X运行下面的查询时:\n
select * from ( select rownum as rn, A.* from X as A order by A.IDdesc) where rn between 0 and 1000000;
\n我得到的结果是:\nrn Id name \n1 1 xxx\n2 2 yyy\n3 4 zzz\n
\n但是对于表Y,当执行相同的查询时,我得到的结果是:\n
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
\nY表中的rn得到了一些随机数。无法理解这种行为。希望能得到帮助。
Rownum not working properly的问题出现的原因是由于使用Rownum伪列时,Oracle在检索行的顺序中添加了Rownum,然后应用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;
另外,某些情况下使用两个子查询会降低性能,但实际上不会降低性能,因为操作的顺序并没有改变,只是以不同的顺序执行相同的操作。
还某些情况下是否可以使用row_number来代替两个子查询,并且是否会提高性能。可以尝试使用row_number,但我不希望性能有所改善,最多只能期望性能相同。