【问题标题】:Get last record of result set获取结果集的最后一条记录
【发布时间】:2018-09-27 21:48:23
【问题描述】:

下面是我用来获取select查询返回结果的最后一条记录的sql查询(oracle)。这是最佳方式吗?

SELECT HAZMAT_PLACARD_NOTATION
        INTO v_pcn
        FROM HAZMAT_CLASS_IRF
        WHERE HAZMAT_CD = p_stcc_cd and ROWID = (SELECT MAX(ROWID) FROM HAZMAT_CLASS_IRF WHERE HAZMAT_CD = p_stcc_cd);

以下是选择查询的示例结果集,其中 HAZMAT_CD = 4920111 但是应该检索 HAZMAT_PLAYCARD_NOTATION 值 SPONTANEOUSLY COMBUSTIBLE 的最后一行。这就是目标

【问题讨论】:

  • 我认为你可以使用 SELECT TOP 1 和 ORDER BY ROWID DESC - 但我不确定在 Oracle 中;)。
  • 我认为你不能在这里使用ORDER BY。这个查询对我来说似乎没问题。
  • 是的 TOP 1 在 oracle 中不起作用
  • 注意ROWID,它的顺序并不代表插入的顺序(见:dba-oracle.com/t_oracle_find_last_row.htm)
  • 如果没有可用的列来确定结果集的最新条目,解决办法是什么?

标签: sql oracle oracle11g


【解决方案1】:

获取结果集的最后一条记录

有很多方法:

Oracle Pre-12c 版本:

  • ROWNUM 在子查询中,ORDER BY 在外部查询中
  • 分析功能

Oracle 12c 版本:

  • Top-n Row 限制功能

使用 ROWNUM

SELECT HAZMAT_PLACARD_NOTATION
INTO v_pcn
FROM
  (SELECT HAZMAT_PLACARD_NOTATION,
    ROWNUM rn
  FROM HAZMAT_CLASS_IRF
  WHERE HAZMAT_CD = p_stcc_cd
  ORDER BY        <sort_column> DESC
  )
WHERE rn =1;

使用Top-n Row Limiting 功能

SELECT HAZMAT_PLACARD_NOTATION
 INTO v_pcn
  FROM HAZMAT_CLASS_IRF
  WHERE HAZMAT_CD = p_stcc_cd
  ORDER BY        <sort_column> DESC
FETCH FIRST 1 ROW ONLY;

请查看此answer 以获取示例和详细说明。

【讨论】:

  • 这是一个很好的解释。但是,与我的问题中的查询相比,使用您提供的带有 ROWNUM 的查询有什么优势。这是最佳方式吗?
  • @AsiriLiyanaArachchi 使用 ROWNUM 只扫描一次表,然后将 ROWNUM 应用于子查询的结果集。在您的查询中,您扫描表两次,这不是最佳的。
  • @AsiriLiyanaArachchi 请将其标记为已回答,会帮助其他人。
  • 我已经编辑了这个问题。我不能使用 order by 。鉴于我提到的查询是我能想出的获得最后一行的唯一方法。有什么想法吗?
  • 我注意到,在您使用 ROWNUM 的解决方案中,可能存在基于问题的错误,我们想要的是结果集的最后一条记录,因此通过后面的过滤“WHERE rn = 1" 无论子查询中的排序如何,您都将获得 rownum 值为 1 的行。在这种情况下,使用 WHERE ROWNUM = 1 会得到想要的结果。
【解决方案2】:

在mysql中,你可以试试这个。

SELECT * 
FROM  `table` 
ORDER BY id DESC 
LIMIT 0 , 1

【讨论】:

  • OP 想做一个INSERT INTO,这使得问题比您发布的查询更棘手。
  • 你的问题是“获取结果集的最后一条记录”
  • 这不是mysql,它是存储过程的一部分。我将返回值保存到变量 v_pcn
  • Oracle 中没有LIMIT 0,1
  • 是的,这是 Mysql 查询
【解决方案3】:
select * from
   ( 
     select * from table order by id desc
   )
where rownum = 1

【讨论】:

  • 我不觉得这个行得通。这不返回结果集的第一行吗?
  • 确实如此,但这也是为什么我按您需要按 desc 排序的任何 ID 排序的原因
  • order by 不是在rownum之后执行的吗? stackoverflow.com/questions/15091849/…
【解决方案4】:

在较旧的 sqlserver 版本 (

但您可以轻松使用 Top 1 并按 desc 排序

select top 1 * from tblc2scdocumentcodes where C2scDocumentCode like '%.14.%' and C2scDocumentCode like '%DTP.SO.%' order by C2scDocumentCode desc

查询返回一个结果集。此结果集的顺序是“颠倒的”,然后限制为 1 条记录

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 2018-11-23
    • 2015-01-29
    • 2017-05-08
    • 1970-01-01
    • 2014-11-08
    • 2014-07-14
    相关资源
    最近更新 更多