为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

沧海一幻觉 2019-11-28 10:31:44
我很难将存储过程从SQL Server转换为Oracle,以使我们的产品与其兼容。我有一个查询,它根据时间戳返回一些表的最新记录:SQL Server:SELECT TOP 1 *FROM RACEWAY_INPUT_LABOORDER BY t_stamp DESC=>这将返回我最近的记录但是甲骨文:SELECT *FROM raceway_input_labo WHERE  rownum <= 1ORDER BY t_stamp DESC=>这将返回我最旧的记录(可能取决于索引),而不管ORDER BY语句如何!我以这种方式封装了Oracle查询以符合我的要求:SELECT * FROM     (SELECT *     FROM raceway_input_labo      ORDER BY t_stamp DESC)WHERE  rownum <= 1而且有效。但这对我来说听起来像是一个骇人听闻的骇客,尤其是如果我在涉及的表中有很多记录的时候。实现此目标的最佳方法是什么?
查看完整描述

3 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

该where声明被执行之前的order by。因此,您所需的查询是说“ 先行,然后按 t_stamp desc 排序 ”。那不是您想要的。


子查询方法是在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”。您可能需要单独列出各列以避免这种情况。


查看完整回答
反对 回复 2019-11-28
?
婷婷同学_

TA贡献1844条经验 获得超8个赞

使用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


查看完整回答
反对 回复 2019-11-28
  • 3 回答
  • 0 关注
  • 1971 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信