Oracle 10g PL/SQL-选择结果作为更新列值

RC.*_*RC. 1 sql oracle plsql oracle10g

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

我有一个表(称之为Source),它有简单的缘故,2列, IDKEY.

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

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

Ste*_*erg 8

我会批评我的批评,说你的桌子设计没有正常化,并且不是很漂亮,但我会假设你有你的理由.我通常使用DECODE结合聚合列进行这些"轮换"查询,按照我的键分组 - 在这种情况下,你的伪键,trunc(ID/100).将它与使用元组的更新语法结合使用:

 UPDATE Foo
    SET (a, b, c, d)
      = (w, x, y, z);
Run Code Online (Sandbox Code Playgroud)

你得到:

  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>;
Run Code Online (Sandbox Code Playgroud)