我将限制我的批评,说你的桌子设计没有规范化,也不是很漂亮,但我假设你有你的理由。我通常通过使用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>;