Jag ska begränsa min kritik till att säga att din bordsdesign inte är normaliserad och inte är särskilt vacker, men jag antar att du har dina skäl. Jag brukar göra dessa "rotations"-frågor genom att använda DECODE kombinerat med en aggregerad kolumn, grupperad efter min nyckel - i det här fallet din pseudo-nyckel, trunc(ID/100). Kombinera det med uppdateringssyntaxen som använder tupler:
UPDATE Foo
SET (a, b, c, d)
= (w, x, y, z);
och du får:
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>;