Oracle 按rownum排序-是否正确?

Oracle 按rownum排序-是否正确?,oracle,rownum,top-n,Oracle,Rownum,Top N,我有一个针对Oracle数据库的规范top-N查询,该数据库由所有常见问题解答和指南建议: select ... from ( select ... from ... order by ... ) where ronwum <= N 这里的两个rownum都是对Oracle伪列的引用;它不是由内部选择返回的 它似乎起作用了。但使用Oracle optimizer,您永远无法确定这是幸运还是真正正确的解决方案 问题是:在这种情况下,按rownum排序是否能保证正确的排序?为什么?我

我有一个针对Oracle数据库的规范top-N查询,该数据库由所有常见问题解答和指南建议:

select ... from (
    select ... from ... order by ...
) where ronwum <= N
这里的两个rownum都是对Oracle伪列的引用;它不是由内部选择返回的

它似乎起作用了。但使用Oracle optimizer,您永远无法确定这是幸运还是真正正确的解决方案

问题是:在这种情况下,按rownum排序是否能保证正确的排序?为什么?我和我的同事未能就此达成一致意见


另外,我知道选择top-N记录的其他方法,例如使用行数分析函数和Oracle 12中引入的fetch first子句。我也知道我可以重复同样的顺序。。。在外部选择。这个问题只与rownum的顺序有关-它是否正确。

内部查询和外部查询可能给出或可能不给出不同的顺序,从而给出不同的rownum顺序。由于rownum已经排序,若您想要获得前N个记录,那个么最好的方法是在内部查询中创建rownum的别名,并在外部查询中使用它

选择。。。从…起 选择rownum rn。。。从…起
其中rn我认为您需要在内部select中将rownum重命名为不同的名称,否则外部引用引用外部查询的rownum,而不是来自内部查询的rownum。正确的方法是在外部查询中按与在子查询中相同的表达式排序。即使在Oracle11及之前的版本中,从内部查询到外部查询的顺序被保留的事实也是一个实现意外——SQL标准不能保证这一点。这是行不通的,因为rownum是在排序之前分配的。此查询将给出N个完全随机的行。而重写查询并不是问题的重点。
select ... from (
    select ... from ... order by ...
) where ronwum <= N
order by rownum