此问题已在此处有答案:
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性能问题生疏了。但我会保留进度计数器!
1条答案
按热度按时间nkhmeac61#
来自文档:
对于查询返回的每一行,ROWNUM伪列返回一个数字,指示Oracle从表或联接行集中选择行的顺序。
关键的是,这发生在应用order-by子句之前:
如果在同一个查询中,ORDER BY子句跟在ROWNUM之后,那么这些行将被ORDER BY子句重新排序。根据访问行的方式,结果可能会有所不同。
因此,
rownum
是为结果集中的每一行生成的,然后对它们进行排序。您可以使用子查询:
如果在子查询中嵌入ORDER BY子句,并在顶级查询中放置ROWNUM条件,则可以在对行进行排序后强制应用ROWNUM条件。
或者使用
ROW_NUMBER()
:db<>fiddle