【问题标题】:How to add running ID in a single UPDATE statement (Oracle)如何在单个 UPDATE 语句中添加运行 ID (Oracle)
【发布时间】:2017-01-19 14:58:28
【问题描述】:

假设我的 Oracle DB 12.1 中有一个表 tab1,它有一个列 record_id(类型 NUMBER)和许多其他列,其中有一个名为 exchg_id 的列。

当一批新行被插入到表中时,这个 record_id 总是空的。我需要做的是为满足条件...WHERE EXCHG_ID = 'something' 的所有行填充值 1..N 的 record_id,并且此类行数为 N。当然我知道如何在程序上执行此操作(在 for 循环中) ,但我想知道是否有使用单个 UPDATE 语句的更快方法。我想像这样:

UPDATE tab1 SET record_id = {1..N} WHERE exchg_id = 'something';

非常感谢您的帮助!

更新:行的顺序并不重要,我不需要特定的顺序。对于任何给定的 exchg_id,我只需要唯一的 record_id 的 1..N。

【问题讨论】:

  • 您只想更新顺序值为 1.2.3.4 的行。对于给定的 exchg_id,以任何顺序(行)?
  • 是的,我不关心行的顺序。很抱歉没有在原文中指出来
  • 假设您只想将此“record_id”添加到新行中,您如何将它们与表中已经存在的行区分开来(并且这也可能满足您拥有的任何条件)?或者条件是否已经这样做了,也许是像“added_date > (something)”这样的条件?
  • 这不是问题。我知道(从不同的表)这些新行必须具有的 exchg_id 的值。没有其他行将满足 where 条件。我可能同时有两个新批次(来自它们的行,record_id = null),但它们会有不同的 exchg_id。所以我会一一处理。

标签: oracle sql-update


【解决方案1】:

您可以使用 rownum 将 record_id 设置为 1 到 N :

UPDATE tab1 SET record_id = rownum WHERE exchg_id = 'something';

如果你有一些偏移量,比如 10,然后使用 rownum + 10

【讨论】:

  • 可能需要在where子句中添加and record_id is null
  • @mathguy - 可能。取决于OP需要什么。
  • 不,实际上我错了 - 我错过了 OP 说“当插入一批新行时,此 record_id 始终为空......”的部分,所以这部分没问题。我问了 OP 另一个问题——关于区分“新”行和“旧”行,假设一些“旧”行也可能满足他/她心目中的条件。由于“过去”的某些行可能不满足条件,因此这些“旧”行在 record_id 中可能仍为 null,因此仅检查是不够的。
  • 有效!我以为我的眼睛在骗我! :) 我知道 rownum 列,但我希望它是在查询处理的其他阶段计算的,这(以典型的 Oracle 方式)会禁止这种使用。幸好我错了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-01
  • 2016-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多