在Oracle SQL语句中与order by子句结合使用的rownum用法

4

以下两条SQL语句中哪一个将返回所需的结果集(即状态为0且开始时间最高的10行)?

这两个语句是否总是返回相同的结果集(StartTime是唯一的)?

SELECT * 
FROM MyTable 
WHERE Status=0 
AND ROWNUM <= 10 
ORDER BY StartTime DESC

SELECT * 
FROM (
    SELECT * 
    FROM MyTable 
    WHERE Status=0 
    ORDER BY StartTime DESC
) 
WHERE ROWNUM <= 10

背景

我的DB管理员告诉我,第一个语句将首先限制表格为10行,然后按StartTime对这些随机行进行排序,这绝不是我想要的。 从我在那个答案中了解到的内容来看,第二个语句的order by子句是多余的,可能会被优化器移除,这也不是我想要的。


我曾经提出过一个类似的问题,涉及到对SQLite数据库查询中的limit子句的理解,并且我有兴趣了解与上述语句(使用limit Vs rownum)在Oracle数据库中使用的任何差异。


第一个查询甚至无法解析。您可能需要编辑您的问题。 - Phil
抱歉出现错误,我已经修复并验证了第一条语句与我们的数据库匹配。第二条语句应该在语法上是正确的。 - nabulke
同时:Wikipedia: FETCH FIRST 子句 - ypercubeᵀᴹ
1
在这些情况下,Oracle优化器不会删除order by子句。 - David Aldridge
显示剩余2条评论
1个回答

4

您的第二个查询将有效。

因为在第一个查询中,首先选择具有状态0的前十行,然后进行排序,因此获取的前十行不一定是最高顺序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接