大多数来源,包括 Oracle 自己的 Top-N Queries文章中,给出类似于以下的语法来执行 Top-N 查询:
SELECT val
FROM (
SELECT val
FROM rownum_order_test
ORDER BY val DESC
)
WHERE ROWNUM <= 5;
这保证给出前 5 个值;但是,是否保证以正确的顺序提供它们? This question , 引用 Wikipedia , 否则表示:
Although some database systems allow the specification of an ORDER BY clause in subselects or view definitions, the presence there has no effect.
这是否意味着上述代码不保证任何排序,并且需要额外的
ORDER BY
,还是特例?SELECT val
FROM (
SELECT val
FROM rownum_order_test
ORDER BY val DESC
)
WHERE ROWNUM <= 5
ORDER BY val DESC; -- Is this line necessary?
编辑 : 假设会直接执行外层查询(不嵌套在另一个查询中)。我提出这个问题是因为感觉像是一个明显的遗漏,没有任何来源(包括 Oracle 的)懒得提及
ORDER BY
的必要性。 ,尽管从这种 top-n 查询中可以直观地预期排序。
最佳答案
order by 在这里显然有影响,因为如果没有,那么查询根本无法提供前 n 个值。
在某些情况下,优化器可能会检测到 ORDER BY 没有提供任何效果,在这种情况下,它可能会转换查询以删除 ORDER BY,但这不是这些情况之一。
如果您的外部查询没有显式或隐式(可能通过连接)重新排序行,那么我相信在这种情况下将保留顺序。
关于sql - Oracle Top-N 查询 : are results guaranteed to be ordered?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40162078/