通过rownum订购 - 是否正确?

时间:2016-12-27 19:58:17

标签: oracle rownum top-n

我对所有常见问题解答和HowTos建议的Oracle数据库进行了规范的前N个查询:

select ... from (
    select ... from ... order by ...
) where ronwum <= N

它在Oracle 11上完美运行,即它按内部选择中指定的顺序返回前N个记录。

然而它在Oracle 12上中断了。它仍然返回相同的前N个记录,但它们可能会被洗牌。这些记录的最终顺序是不确定的。

我用谷歌搜索但没有找到任何相关的讨论。看起来其他人总是从这样的选择中获得正确的记录顺序。

但有一个发现很有意思。我看到有些人在外部选择中使用了(不幸的是没有解释)另外的order by rownum子句:

select ... from (
    select ... from ... order by ...
) where ronwum <= N
order by rownum

(这里的rownum都是对Oracle伪列的引用;它是不是内部选择返回的内容)

似乎有效。但是使用Oracle优化器,您永远无法确定它是运气还是非常正确的解决方案。

问题是:order by rownum保证在这种情况下是否正确排序,为什么?我和我的同事无法达成一致意见。

P.S。我知道选择前N个记录的其他方法,例如使用Oracle 12中引入的row_number分析函数和fetch first子句。我也知道我可以在外部select上重复相同的order by ...。问题仅在于order by rownum - 是否正确。

1 个答案:

答案 0 :(得分:-1)

内部查询和外部查询可能会或可能不会给出不同的顺序,因此rownum的顺序也不同。由于rownum已经被排序,如果你想获得前N个记录,那么最好的办法就是在内部查询中创建rownum的别名并在外部查询中使用它。

选择...来自(     从...中选择rownum ... )其中rn <= N 按顺序排列