【问题标题】:Oracle 10g PL/SQL- Select results as update column valuesOracle 10g PL/SQL - 选择结果作为更新列值
【发布时间】:2010-11-03 10:22:44
【问题描述】:

有没有办法使用 Oracle 10g 中查询的记录值轻松/优雅地更新表中的多个列?

为了简单起见,我有一个表(称为 Source),有 2 列,IDKEY

身份证钥匙 ---- ---- 1 1000 2 1000 3 5000 4 1000 .. 101 8000 102 9000 103 7000 104 9000 ... 201 5 202 5 ...

我有另一个表(称为KeyMap),它采用trunc(ID/100) 并将其用作batchID 列是批次中 ID 的键映射:

trunc(ID/100) key1 key2 key3 key4 ..... key99 ------------- ---- ---- ---- ---- 0 1000 1000 5000 1000 1 8000 9000 7000 9000 2 5 5

ID 是分批创建和处理的,因此在批处理结束时,我想调用一个存储过程来使用新的 Key 值更新 KeyMap 表中的记录,并使用 1 个更新语句使用提供这些键值的子选择或集合。

这可能吗?最好/最有效的方法是什么?

【问题讨论】:

  • 我对你的问题有不好的预感。看来您正在寻找一种优雅的方式来做一些毫无意义的事情……但也许只是您的示例过于简单。

标签: sql oracle plsql oracle10g


【解决方案1】:

您可以生成一个 Oracle VARRAY 并批量传递您的密钥。您的过程可以遍历 VARRAY 并更新表。

【讨论】:

    【解决方案2】:

    我将限制我的批评,说你的桌子设计没有标准化,也不是很漂亮,但我假设你有你的理由。我通常通过将 DECODE 与聚合列结合使用来执行这些“旋转”查询,并按我的键进行分组——在这种情况下,您的伪键 trunc(ID/100)。结合使用元组的更新语法:

     UPDATE Foo
        SET (a, b, c, d)
          = (w, x, y, z);
    

    你会得到:

      UPDATE KeyMap
         SET
           ( key1
           , key2
           , key3
           , key4
           ...
           , key99
           )
           = ( SELECT MAX(decode(mod(ID, 100), 1, Key, NULL))
                    , MAX(decode(mod(ID, 100), 2, Key, NULL))
                    , MAX(decode(mod(ID, 100), 3, Key, NULL))
                    , MAX(decode(mod(ID, 100), 4, Key, NULL))
                    ...
                    , MAX(decode(mod(ID, 100), 99, Key, NULL))
                 FROM Source
                WHERE Trunc(Source.ID / 100) = KeyMap.batchId
                GROUP BY Trunc(Source.ID / 100)
             )
       WHERE BatchId = <x>;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多