有没有办法轻松/优雅地更新表中包含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使用提供这些键值的子选择或集合的更新语句。
这是可能的吗?最好/最有效的方法是什么?
答案 0 :(得分:8)
我会批评我的批评,说你的桌面设计没有正常化,并且不是很漂亮,但我会假设你有理由。我通常使用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>;
答案 1 :(得分:0)
您可以生成Oracle VARRAY并批量传入密钥。您的过程可以迭代VARRAY并更新表。