首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何正确使用Oracle ORDER BY和ROWNUM?

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

Stack Overflow用户
提问于 2013-02-26 22:39:43
回答 5查看 315K关注 0票数 139

我很难将存储过程从SQL Server转换到Oracle,以便让我们的产品与之兼容。

我有基于时间戳返回某些表的最新记录的查询:

SQL Server:

代码语言:javascript
复制
SELECT TOP 1 *
FROM RACEWAY_INPUT_LABO
ORDER BY t_stamp DESC

将返回最新记录的=>

但是甲骨文:

代码语言:javascript
复制
SELECT *
FROM raceway_input_labo 
WHERE  rownum <= 1
ORDER BY t_stamp DESC

无论ORDER BY语句是什么,它都会返回最旧的记录(可能取决于索引)!

我以这种方式封装Oracle查询,以满足我的需求:

代码语言:javascript
复制
SELECT * 
FROM 
    (SELECT *
     FROM raceway_input_labo 
     ORDER BY t_stamp DESC)
WHERE  rownum <= 1

而且它是有效的。但对我来说,这听起来像是一个可怕的黑客攻击,特别是当我在涉及的表中有很多记录的时候。

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-02-26 22:42:00

order by之前执行where语句。因此,您想要的查询是“获取第一行,然后按t_stamp描述对其进行排序”。而这并不是你想要的。

subquery方法是在Oracle中执行此操作的适当方法。

如果你想要一个在两台服务器上都能工作的版本,你可以使用:

代码语言:javascript
复制
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“。您需要单独列出列以避免这种情况。

票数 131
EN

Stack Overflow用户

发布于 2013-02-26 22:47:44

请改用ROW_NUMBER()ROWNUM是一个伪列,ROW_NUMBER()是一个函数。您可以阅读它们之间的差异,并查看以下查询的输出差异:

代码语言:javascript
复制
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
票数 46
EN

Stack Overflow用户

发布于 2021-05-12 23:03:11

自从Oracle12c以来,我们现在有了row limiting clauses,它就是这样做的。

代码语言:javascript
复制
SELECT *
FROM raceway_input_labo 
ORDER BY t_stamp DESC
FETCH FIRST ROW ONLY

或者用于不同场景的多个alternatives (前n行、平局处理等)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15091849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档