我对所有常见问题解答和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
- 是否正确。
答案 0 :(得分:-1)
内部查询和外部查询可能会或可能不会给出不同的顺序,因此rownum的顺序也不同。由于rownum已经被排序,如果你想获得前N个记录,那么最好的办法就是在内部查询中创建rownum的别名并在外部查询中使用它。
选择...来自( 从...中选择rownum ... )其中rn <= N 按顺序排列