我正在编写一个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
语句一样工作吗?
感谢您的时间。
答案 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;