sql - Oracle Top-N 查询 : are results guaranteed to be ordered?

标签 sql oracle

大多数来源,包括 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/

相关文章:

SQL Server : Storing Query Result into Variable

sql - 如何计算数据库链接上的行数?

sql - 从(非索引/非顺序)大文件中提取新行的好方法

c# - 如何在 C# 中创建存储过程,然后将其*保存*到 SQL Server?

sql - Select 语句和 If/else 语句

java - 使用别名时 JDBC 结果集不起作用我收到 "java.sql.SQLSyntaxErrorException: ORA-00905: missing keyword"

使用PreparedStatement 语句进行 Java Oracle Blob 与 Blob 比较失败

sql - Oracle 特定排序

mysql - sql 一个字段有多个键

sql - 用逗号将一个字符串拆分为多列