Oracle DB ORDER BY和ROWNUM反转订单?

时间:2014-07-15 18:12:28

标签: sql oracle

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

+============+=================+
| sv_version | sv_date_applied |
+============+=================+
| 7.3.0      | 13-JUL-2014     |
+------------+-----------------+
| 7.4.0      | 13-JUL-2014     |
+------------+-----------------+

...我的SQL语句如下所示:

SELECT sv_version FROMtblSchemaVersion ORDER BY sv_date_applied DESC;

......我明白了:

+============+
| sv_version |
+============+
| 7.4.0      |
+------------+
| 7.3.0      |
+------------+

...但是当我尝试获得顶行(7.4.0)时,就像这样:

SELECT sv_version, ROWNUM FROM tblSchemaVersion WHERE ROWNUM = 1 ORDER BY sv_date_applied DESC;

......我明白了:

+============+========+
| sv_version | ROWNUM |
+============+========+
| 7.3.0      | 1      |
+------------+--------+

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

感谢您的时间。

5 个答案:

答案 0 :(得分:3)

它不像TOP那样有用。

Oracle在ROWNUM之前应用ORDER BY

您需要的是

SELECT ROWNUM, sv_version FROM
  ( 
    SELECT
    sv_version  
    FROM tblSchemaVersion 
    ORDER BY sv_date_applied DESC
  )
WHERE ROWNUM = 1

请参阅此SqlFiddle以查看其工作原理

答案 1 :(得分:1)

在Oracle中,Rownum是一个伪列,它应用于查询选择的行。

where子句订单子句

之前执行

在第二个查询中, SELECT sv_version,ROWNUM FROM tblSchemaVersion WHERE ROWNUM = 1 ORDER BY sv_date_applied DESC;

第一部分:

SELECT sv_version,ROWNUM FROM tblSchemaVersion 会给出结果:

| sv_version |
+============+
| 7.3.0      |
+------------+
| 7.4.0      |
+------------+

首先执行,其结果为

| sv_version |
+============+
| 7.3.0      |
+------------+

然后order by子句只运行一行,这就是为什么结果

答案 2 :(得分:0)

此处的问题是您的ROWNUM = 1谓词是在ORDER BY之前应用的。声明

SELECT sv_version, ROWNUM 
  FROM tblSchemaVersion 
 WHERE ROWNUM = 1 
 ORDER BY sv_date_applied DESC;

说"从桌子上给我任意一行,我不在乎哪一个。然后按sv_date_applied"对我的1行结果集进行排序。显然,这不是你想要的。您希望在排序后应用ROWNUM谓词。所以你会想要像

这样的东西
SELECT sv_version
  FROM (SELECT sv_version
          FROM tblSchemaVersion
         ORDER BY sv_date_applied DESC) 
 WHERE rownum = 1

答案 3 :(得分:0)

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

SELECT sv_version 
FROM
  ( 
    SELECT
       sv_version,
       ROW_NUMBER() OVER (ORDER BY sv_date_applied DESC) rn
    FROM tblSchemaVersion 
  )
WHERE rn = 1

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

答案 4 :(得分:0)

WITH  MRDW_2
 AS (SELECT * FROM   TABLE1
   ORDER BY
     case when :dir_param = '0'  then LONGNAM end,
     case when :dir_param <>'0'  then LONGNAM end desc
       ),
 MRDW     
 AS   (select * from MRDW_2
     WHERE ROWNUM=1)


SELECT * FROM MRDW;