【问题标题】:How do I get most recent row in select statement on Oracle Apex 5?如何在 Oracle Apex 5 上的 select 语句中获取最新行?
【发布时间】:2017-03-30 13:36:11
【问题描述】:

当用户填写表单时,某一列会从某些列中提取最新数据并将这些列连接到一个新列(记录的 id)中。现在我选择了正确的列,但我遇到的问题是,对于每个填写的表格,代码只会从第一个填写的记录中获取行。显然TOPLIMIT 在Oracle Apex 5 上不起作用,而且似乎ROWNUM = 1 是导致问题的原因。

DECLARE
  IDENTITY VARCHAR2(40);
BEGIN
  SELECT CONCAT(COL1, CONCAT('-', CONCAT(COL2, COL3)))
 INTO IDENTITY FROM TABLE
 WHERE ROWNUM = 1;
 RETURN IDENTITY; 
END;

【问题讨论】:

  • where rownum = 1 使用 rownum 伪列仅返回结果集的第一行。它正在做它编码要做的事情。你想从查询中返回什么,你已经指定了它在做什么但不是你想要的?
  • 另外,为了可读性,考虑连接运算符的可读性。选择 col1 || '-' || col2 || col3 ...
  • 管道 (||) 不起作用,所以我必须这样做。
  • 我希望它获取最新的行,而不是只获取那里的第一行。
  • “管道不工作”。那么你做错了。为什么他们不为你工作?

标签: sql oracle plsql oracle-apex oracle-apex-5


【解决方案1】:

您没有指定 oracle 版本。 Pre-12c,你必须先对结果进行排序,然后返回第一行。这称为 Top-N 查询。您需要在下面的查询中提供搜索列。

DECLARE
  IDENTITY VARCHAR2(40);
BEGIN
 SELECT NEW_ID
 INTO IDENTITY
 FROM (SELECT COL1 || '-' || COL2 || COL3 as NEW_ID
       FROM TABLE
       ORDER BY <sort column> )
 WHERE ROWNUM = 1;
 RETURN IDENTITY; 
END;

如果您使用的是 12c,则只能使用 FETCH FIRST ROW

DECLARE
  IDENTITY VARCHAR2(40);
BEGIN
 SELECT COL1 || '-' || COL2 || COL3
 INTO IDENTITY
 FROM TABLE
 ORDER BY <sort column>
 FETCH FIRST ROW ONLY;
 RETURN IDENTITY; 
END;

【讨论】:

  • 问题是,我现在正在获取最新的行,所以这是可行的,但是现在当我检查记录时,它们的所有身份都相同,并且它们随着新记录的变化而变化添加。所以假设有五个记录(A、B、C、D、E),它们的身份都是 E-E5。如果我添加一条新记录,那么所有记录都将具有相同的标识:F-F6。
  • 但是,我想要的是记录 A 具有身份 A-A1,记录 B 将是 B-B2,记录 C 将是 C-C2,D 将是 D-D4 等等.
  • 顺便说一句,我正在使用 rownum(你的第一个建议)
  • 你要么需要一个序列来帮助定义年表,要么需要一个日期。
  • @ruchithelamp 听起来您的更新逻辑有不同的问题。根据您所说的,您似乎正在更新所有行,而不仅仅是在更新语句中使用适当的 where 子句更新目标行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-24
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
  • 2020-01-05
  • 1970-01-01
相关资源
最近更新 更多