RC.*_*RC. 1 sql oracle plsql oracle10g
有没有办法轻松/优雅地更新表中的多个列,其中包含Oracle 10g中查询的记录值?
我有一个表(称之为Source),它有简单的缘故,2列, ID和KEY.
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更新语句更新新值值.
这是可能的,这是最好/最有效的方法吗?
我会批评我的批评,说你的桌子设计没有正常化,并且不是很漂亮,但我会假设你有你的理由.我通常使用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)