Oracle ROWNUM未按预期顺序出现[重复]

kgqe7b3p  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(122)

此问题已在此处有答案

How to use Oracle ORDER BY and ROWNUM correctly?(5个答案)
19天前关闭。
我有一个迭代游标并写出SQL的过程。我想写一个带有行数的进度计数器,比如100、200、300等。

CURSOR c_data IS
SELECT ROWNUM AS rn, <data columns>
FROM <table>
ORDER BY <columns>;

FOR r_data IN c_data LOOP
  <write statement>
  IF MOD(r_data.rn, 100) = 0 THEN
    <write counter>
  END IF;
END LOOP;

然而,输出不是按照预期的顺序!它不断地写出300,100,200,800,400,500,600,700。
有什么想法为什么ROWNUM没有按顺序出来?

  • 更新:* 有人向我指出,这种频繁的提交是一个可怕的想法。我要把它带上飞机!我真的过时了,对SQL性能问题生疏了。但我会保留进度计数器!
nkhmeac6

nkhmeac61#

来自文档:
对于查询返回的每一行,ROWNUM伪列返回一个数字,指示Oracle从表或联接行集中选择行的顺序。
关键的是,这发生在应用order-by子句之前:
如果在同一个查询中,ORDER BY子句跟在ROWNUM之后,那么这些行将被ORDER BY子句重新排序。根据访问行的方式,结果可能会有所不同。
因此,rownum是为结果集中的每一行生成的,然后对它们进行排序。
您可以使用子查询:
如果在子查询中嵌入ORDER BY子句,并在顶级查询中放置ROWNUM条件,则可以在对行进行排序后强制应用ROWNUM条件。

SELECT ROWNUM AS rn, <data columns>
FROM (
  SELECT <data columns>
  FROM <table>
  ORDER BY <columns>
)
ORDER BY <columns>;

或者使用ROW_NUMBER()

SELECT ROW_NUMBER() OVER (ORDER BY <columns>) AS rn, <data columns>
FROM <table>
ORDER BY <columns>;

db<>fiddle

相关问题