首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle DB ORDER BY和ROWNUM Inverting Order?

Oracle DB ORDER BY和ROWNUM Inverting Order?
EN

Stack Overflow用户
提问于 2014-07-16 02:12:28
回答 4查看 3.7K关注 0票数 3

我正在编写一条Oracle SQL语句,以获取最新日期的值。如果我的表看起来像这样:

代码语言:javascript
复制
+============+=================+
| sv_version | sv_date_applied |
+============+=================+
| 7.3.0      | 13-JUL-2014     |
+------------+-----------------+
| 7.4.0      | 13-JUL-2014     |
+------------+-----------------+

..。我的SQL语句看起来像这样:

代码语言:javascript
复制
SELECT sv_version FROMtblSchemaVersion ORDER BY sv_date_applied DESC;

..。我得到了:

代码语言:javascript
复制
+============+
| sv_version |
+============+
| 7.4.0      |
+------------+
| 7.3.0      |
+------------+

...but当我尝试获取顶行(7.4.0)时,如下所示:

代码语言:javascript
复制
SELECT sv_version, ROWNUM FROM tblSchemaVersion WHERE ROWNUM = 1 ORDER BY sv_date_applied DESC;

..。我得到了:

代码语言:javascript
复制
+============+========+
| sv_version | ROWNUM |
+============+========+
| 7.3.0      | 1      |
+------------+--------+

为什么ROWNUM要更改行的顺序?我假设它会像SQL Server的TOP或MySQL的LIMIT语句一样工作?

谢谢您抽时间见我。

EN

回答 4

Stack Overflow用户

发布于 2014-07-16 02:16:34

它不像TOP那样工作。

Oracle在ORDER BY之前应用ROWNUM

你需要的是

代码语言:javascript
复制
SELECT ROWNUM, sv_version FROM
  ( 
    SELECT
    sv_version  
    FROM tblSchemaVersion 
    ORDER BY sv_date_applied DESC
  )
WHERE ROWNUM = 1

请查看此SqlFiddle以了解其工作原理

票数 4
EN

Stack Overflow用户

发布于 2014-07-16 02:16:39

这里的问题是,您的ROWNUM = 1谓词在ORDER BY之前应用。这句话

代码语言:javascript
复制
SELECT sv_version, ROWNUM 
  FROM tblSchemaVersion 
 WHERE ROWNUM = 1 
 ORDER BY sv_date_applied DESC;

是说“从表中给我任意一行,我不管是哪一行。然后按sv_date_applied对我的1行结果集进行排序”。显然,这不是你想要的。您希望在排序之后应用ROWNUM谓词。所以你想要像这样的东西

代码语言:javascript
复制
SELECT sv_version
  FROM (SELECT sv_version
          FROM tblSchemaVersion
         ORDER BY sv_date_applied DESC) 
 WHERE rownum = 1
票数 1
EN

Stack Overflow用户

发布于 2014-07-16 02:38:50

您还可以使用ROW_NUMBER尝试更符合标准SQL的版本:

代码语言:javascript
复制
SELECT sv_version 
FROM
  ( 
    SELECT
       sv_version,
       ROW_NUMBER() OVER (ORDER BY sv_date_applied DESC) rn
    FROM tblSchemaVersion 
  )
WHERE rn = 1

这样你也可以得到第二行或每组的最大行数...

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24765274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档