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

如何正确使用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_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

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


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


查看完整描述

3 回答

?
慕码人2483693

该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
?
婷婷同学_

使用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
?
翻翻过去那场雪

上面的评论中记录了几个与此有关的设计问题。简而言之,在Oracle中,当大型表和/或具有相同列名的表时,您需要手动限制结果(并且您不想显式地将它们全部键入并重命名)。一个简单的解决方案是弄清楚您的断点并在查询中限制它。或者,如果您没有冲突的列名约束,也可以在内部查询中执行此操作。例如


WHERE m_api_log.created_date BETWEEN TO_DATE('10/23/2015 05:00', 'MM/DD/YYYY HH24:MI') 

                                 AND TO_DATE('10/30/2015 23:59', 'MM/DD/YYYY HH24:MI')  

将大大减少结果。然后,您可以进行ORDER BY甚至进行外部查询来限制行。


另外,我认为TOAD具有限制行的功能。但是,不确定在Oracle的实际查询中是否存在限制。不确定。


查看完整回答
反对 回复 2019-11-28

添加回答

回复

举报

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