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 一起使用的上述语句(使用 limit
与 rownum
)的任何差异。
【问题讨论】:
第一个查询甚至没有解析。您可能需要编辑您的问题。 第二个需要别名。 抱歉出现错误。我针对我们的数据库修复并验证了声明一。第二个语句在语法上应该是正确的。 相关: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 语句的顺序