oracle SQL语句中结合order by子句使用rownum

Posted

技术标签:

【中文标题】oracle SQL语句中结合order by子句使用rownum【英文标题】:Using rownum in oracle SQL statement in combination with order by clause 【发布时间】:2012-05-03 11:49:19 【问题描述】:

以下两条 SQL 语句中哪一条会返回所需的结果集(即 Status=0 和 StartTimes 最高的十行)?

两个语句是否总是返回相同的结果集(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

背景

我的 DBAdmin 告诉我,第一条语句将 first 将表限制为 10 行,然后按 StartTime 对这些随机行进行排序,这绝对不是我想要的。 根据我在that answer 中了解到的,第二条语句的 order by 子句是多余的,可以被优化器删除,这也不是我想要的。


我问了一个similar question limit 在对 SQLite 数据库的查询中的子句,并有兴趣了解与 oracle db 一起使用的上述语句(使用 limitrownum)的任何差异。

【问题讨论】:

第一个查询甚至没有解析。您可能需要编辑您的问题。 第二个需要别名。 抱歉出现错误。我针对我们的数据库修复并验证了声明一。第二个语句在语法上应该是正确的。 相关:How to select the nth row in a SQL database table? 在这些情况下,Oracle 优化器不会删除 order by 子句 【参考方案1】:

您的第二个查询将起作用

因为在第一个中,选择了状态为 0 的前十行,然后按顺序完成,在这种情况下,获取的前十行不必是最高顺序

【讨论】:

以上是关于oracle SQL语句中结合order by子句使用rownum的主要内容,如果未能解决你的问题,请参考以下文章

没有 Order By 子句的 SQL Select 语句的顺序

子查询中不允许用order by子句,那么应该怎么办?

SQL Server MERGE 语句和 ORDER BY 子句

SQL-W3School:SQL ORDER BY 子句

SQL Order By 子句详解

SQL语句中,为啥where子句不能使用列别名,而order by却可以?