当前位置: 首页 > 知识库问答 >
问题:

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

段超
2023-03-14

我很难将存储过程从SQLServer转换为Oracle以使我们的产品与之兼容。

我有一些查询,根据时间戳返回一些表的最新记录:

SQL Server:

SELECT TOP 1 *
FROM RACEWAY_INPUT_LABO
ORDER BY t_stamp DESC

=

但Oracle:

SELECT *
FROM raceway_input_labo 
WHERE  rownum <= 1
ORDER BY t_stamp DESC

=

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

SELECT * 
FROM 
    (SELECT *
     FROM raceway_input_labo 
     ORDER BY t_stamp DESC)
WHERE  rownum <= 1

这是可行的。但对我来说,这听起来像是一个可怕的黑客攻击,尤其是当我在相关的表中有很多记录时。

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

共有3个答案

宫修贤
2023-03-14

自从Oracle 12c以来,我们现在有了行限制子句,它正好做到了这一点。

SELECT *
FROM raceway_input_labo 
ORDER BY t_stamp DESC
FETCH FIRST ROW ONLY

或者不同场景的许多替代方案(前n行、平局处理等)。

楮法
2023-03-14

改用ROW\u 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

公西俊民
2023-03-14

在排序依据之前执行where语句。因此,您想要的查询是“取第一行,然后按t_stamp排序”。这不是你想要的。

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

 类似资料:
  • 问题内容: 我试图通过以下方式将多维度Javascript数组传递到网站上的另一页: 在数组上使用JSON.stringify 将结果值分配给输入字段 将该字段发布到第二页 在发布的值上使用json_decode 然后使用var_dump进行测试 (直接回显已发布的变量只是看它是否通过了) 第一页的Javascript: 第二页的php: 回声工作正常,但var_dump返回NULL 我做错了什么

  • 我正在用Java Swing制作一个游戏,其中有一个大POJO用来存储游戏的运行时数据,比如精灵的位置、当前显示的效果等等。我希望能够将其作为JSON保存到一个文件中,然后在以后重新构建。我发现Gson应该就是这么做的,但到目前为止我还没能让它工作。我总是遇到这样一个问题:它无法使嵌套在存储类中的某些变量可访问。 以下是我目前使用Gson的方式: 以下是我当前尝试使用时收到的错误消息: 是我在开头

  • 问题内容: 我只想检索UserAccount类中的某些列,所以我有以下代码: 我得到了空值作为回报。但是,如果我注释掉setProjections,我将获得具有所有属性的用户。在这种情况下,如何正确使用setProjection? 问题答案: 它返回一个Object数组,因此代码应为:

  • 问题内容: 我不知道我在哪里错了:/。当我运行这段代码时,我得到的只是一个空白元素。我似乎无法让insertRule方法执行任何操作(甚至不会产生错误)。我想念什么吗? 问题答案: 这有点令人困惑,但是您的代码确实可以工作,只是您看不到返回的XML树中插入的规则。 为了验证您的代码是否有效,您可以执行两个测试: 运行上面的代码片段,您可以看到CSS规则确实适用。并且属性也在控制台中更改。 当浏览器

  • 问题内容: 如何使用从类路径中查找递归资源? 例如 在“目录”中查找所有资源:想象一下 不幸的是,这只会检索到恰好该“目录”。 所有资源都已命名(递归) 但这返回一个空。 还有一个额外的问题:与有什么不同? 问题答案: 没有办法递归搜索类路径。您需要知道资源的完整路径名才能以这种方式检索它。该资源可能位于文件系统中的目录中,也可能位于jar文件中,因此它不像执行“类路径”的目录列表那样简单。您将需

  • 问题内容: 我最近开始使用ScriptManager。我有一个通过JavaScript填充的ASP.NET DropDownList控件。但是,我正在使用事件验证。因此,如果我不使用下拉菜单中的“ RegisterForEventValidation”调用,则会遇到以下错误。我怎么知道在第二个参数中设置什么值(我有“值”)?我正在通过JavaScript填充下拉列表,因此我不知道后面的代码中包含哪