如何正确使用Oracle ORDER BY和ROWNUM?

我很难将存储过程从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

而且有效。但这对我来说听起来像是一个骇人听闻的骇客,尤其是如果我在涉及的表中有很多记录的时候。


实现此目标的最佳方法是什么?


沧海一幻觉
浏览 1978回答 3
3回答

慕码人2483693

该where声明被执行之前的order by。因此,您所需的查询是说“ 先行,然后按 t_stamp desc 排序 ”。那不是您想要的。子查询方法是在Oracle中执行此操作的正确方法。如果要在两个服务器上都可以使用的版本,可以使用:select ril.*from (select ril.*, row_number() over (order by t_stamp desc) as seqnum&nbsp; &nbsp; &nbsp; from raceway_input_labo ril&nbsp; &nbsp; &nbsp;) rilwhere seqnum = 1外部*将在最后一列中返回“ 1”。您可能需要单独列出各列以避免这种情况。

婷婷同学_

使用ROW_NUMBER()代替。ROWNUM是一个伪列,ROW_NUMBER()是一个函数。您可以了解它们之间的差异,并查看以下查询的输出差异:SELECT * FROM (SELECT rownum, deptno, ename&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FROM scott.emp&nbsp; &nbsp; &nbsp; &nbsp; ORDER BY deptno&nbsp; &nbsp; &nbsp; &nbsp;)&nbsp;WHERE rownum <= 3&nbsp;/ROWNUM&nbsp; &nbsp; DEPTNO&nbsp; &nbsp; ENAME---------------------------&nbsp;7&nbsp; &nbsp; &nbsp; &nbsp; 10&nbsp; &nbsp; CLARK&nbsp;14&nbsp; &nbsp; &nbsp; &nbsp;10&nbsp; &nbsp; MILLER&nbsp;9&nbsp; &nbsp; &nbsp; &nbsp; 10&nbsp; &nbsp; KING&nbsp;SELECT * FROM&nbsp;&nbsp;(&nbsp; SELECT deptno, ename&nbsp; &nbsp; &nbsp; &nbsp;, ROW_NUMBER() OVER (ORDER BY deptno) rno&nbsp; FROM scott.emp&nbsp;ORDER BY deptno&nbsp;)WHERE rno <= 3/DEPTNO&nbsp; &nbsp; ENAME&nbsp; &nbsp; RNO-------------------------10&nbsp; &nbsp; CLARK&nbsp; &nbsp; &nbsp; &nbsp; 110&nbsp; &nbsp; MILLER&nbsp; &nbsp; &nbsp; &nbsp;210&nbsp; &nbsp; KING&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;3
打开App,查看更多内容
随时随地看视频慕课网APP