Rownum工作不正常

11 浏览
0 Comments

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得到了一些随机数。无法理解这种行为。希望能得到帮助。

0
0 Comments

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,但我不希望性能有所改善,最多只能期望性能相同。

0