我很难将存储过程从SQL Server转换到Oracle,以便让我们的产品与之兼容。
我有基于时间戳返回某些表的最新记录的查询:
SQL Server:
SELECT TOP 1 *
FROM RACEWAY_INPUT_LABO
ORDER BY t_stamp DESC
将返回最新记录的=>
但是甲骨文:
SELECT *
FROM raceway_input_labo
WHERE rownum <= 1
ORDER BY t_stamp DESC
无论ORDER BY
语句是什么,它都会返回最旧的记录(可能取决于索引)!
我以这种方式封装Oracle查询,以满足我的需求:
SELECT *
FROM
(SELECT *
FROM raceway_input_labo
ORDER BY t_stamp DESC)
WHERE rownum <= 1
而且它是有效的。但对我来说,这听起来像是一个可怕的黑客攻击,特别是当我在涉及的表中有很多记录的时候。
实现这一目标的最佳方法是什么?
发布于 2013-02-26 22:42:00
在order by
之前执行where
语句。因此,您想要的查询是“获取第一行,然后按t_stamp
描述对其进行排序”。而这并不是你想要的。
subquery方法是在Oracle中执行此操作的适当方法。
如果你想要一个在两台服务器上都能工作的版本,你可以使用:
select ril.*
from (select ril.*, row_number() over (order by t_stamp desc) as seqnum
from raceway_input_labo ril
) ril
where seqnum = 1
外部*
将在最后一列返回"1“。您需要单独列出列以避免这种情况。
发布于 2013-02-26 22:47:44
请改用ROW_NUMBER()
。ROWNUM
是一个伪列,ROW_NUMBER()
是一个函数。您可以阅读它们之间的差异,并查看以下查询的输出差异:
SELECT * FROM (SELECT rownum, deptno, ename
FROM scott.emp
ORDER BY deptno
)
WHERE rownum <= 3
/
ROWNUM DEPTNO ENAME
---------------------------
7 10 CLARK
14 10 MILLER
9 10 KING
SELECT * FROM
(
SELECT deptno, ename
, ROW_NUMBER() OVER (ORDER BY deptno) rno
FROM scott.emp
ORDER BY deptno
)
WHERE rno <= 3
/
DEPTNO ENAME RNO
-------------------------
10 CLARK 1
10 MILLER 2
10 KING 3
发布于 2021-05-12 23:03:11
自从Oracle12c以来,我们现在有了row limiting clauses,它就是这样做的。
SELECT *
FROM raceway_input_labo
ORDER BY t_stamp DESC
FETCH FIRST ROW ONLY
或者用于不同场景的多个alternatives (前n行、平局处理等)。
https://stackoverflow.com/questions/15091849
复制相似问题