Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle Top-N查询:结果是否保证订购?_Sql_Oracle - Fatal编程技术网

Sql Oracle Top-N查询:结果是否保证订购?

Sql Oracle Top-N查询:结果是否保证订购?,sql,oracle,Sql,Oracle,大多数来源(包括Oracle自己的文章)提供了与以下类似的语法来执行Top-N查询: SELECT val FROM ( SELECT val FROM rownum_order_test ORDER BY val DESC ) WHERE ROWNUM <= 5; 编辑:假设外部查询将直接执行,而不是嵌套在另一个查询中。我之所以提出这个问题,是因为感觉像是一个明显的遗漏,包括Oracle在内的所有消息来源都懒得提及ORDER BY的必要性,尽管这样的top-n查

大多数来源(包括Oracle自己的文章)提供了与以下类似的语法来执行Top-N查询:

SELECT val
FROM (
    SELECT val
    FROM rownum_order_test
    ORDER BY val DESC
)
WHERE ROWNUM <= 5;

编辑:假设外部查询将直接执行,而不是嵌套在另一个查询中。我之所以提出这个问题,是因为感觉像是一个明显的遗漏,包括Oracle在内的所有消息来源都懒得提及ORDER BY的必要性,尽管这样的top-n查询会直观地预期到ORDER BY的存在。

ORDER BY显然在这里有影响,因为如果不这样做,那么查询就无法提供top-n值

在某些情况下,优化程序可能会检测到ORDER by没有提供任何效果,在这种情况下,它可能会转换查询以删除ORDER by,但这不是这些情况之一


如果您的外部查询没有通过联接显式或隐式地对行重新排序,那么我相信在这种情况下,顺序将被保留。

在旧版本的ORACLE 8.0中,您不可能在子查询中使用order BY子句。所以,只有我们这些还使用一些古老版本的人,才有另一种方法来处理:联合运算符的魔力。UNION将按查询中的列对记录进行排序:

例如:

SELECT * FROM
(SELECT EMP_NO, EMP_NAME FROM EMP_TABLE
UNION
SELECT 99999999999,'' FROM DUAL)
WHERE ROWNUM<=5;
其中99999999999大于EMP_NO.中的所有值

或者,如果要选择薪资最高的5名员工,请选择5名薪资最高的员工:

SELECT EMP_NO, EMP_NAME, 99999999999999-TMP_EMP_SAL
FROM
(SELECT 99999999999999-EMP_SAL TMP_EMP_SAL, EMP_NO, EMP_NAME 
FROM EMP_TABLE
UNION
SELECT 99999999999999,0,'' FROM DUAL)
WHERE ROWNUM<=5;
问候,,
Virgil Ionescu

如果您试图以特定顺序显示最终结果,则需要额外的订单。如果没有它,前5行将以随机顺序返回,这在某些情况下是意料之中的,但并不总是如此。谢谢@vkp,我也很担心。尽管我发现所有来源都忽略了指出这一重要细节是可疑的,因为在执行top-n查询时,人们会直觉地期望按排序顺序返回行。使用诸如行数、秩、密秩等分析函数可以保证结果。否。如果要在Oracle中对结果进行排序,请使用order by。就这么简单。按正确顺序返回行的概念本身并没有100%的意义。外部查询不知道如何使用这些行,它本身是用于连接的子查询、更高级别的查询还是WHERE子句?因此,没有正确的秩序。如果您使用生成的行的方式是在屏幕上显示它们或将它们写入文件,并且您需要按特定顺序使用它们,那么您应该使用其他顺序。这就是理论。在实践中,Oracle有可能在对内部查询中的行进行排序后,会按照该顺序检索这些行。我也这么认为,但我想先找到一些关于这种行为的文档,然后再接受它作为最终结果。许多人对.NET中字典的顺序做出了相同的假设,这种假设在大多数情况下似乎被保留下来,但在某些情况下却被证明是正确的。
SELECT EMP_NO, EMP_NAME, 99999999999999-TMP_EMP_SAL
FROM
(SELECT 99999999999999-EMP_SAL TMP_EMP_SAL, EMP_NO, EMP_NAME 
FROM EMP_TABLE
UNION
SELECT 99999999999999,0,'' FROM DUAL)
WHERE ROWNUM<=5;