Je limiterai ma critique à dire que la conception de votre table n'est pas normalisée et n'est pas très jolie, mais je suppose que vous avez vos raisons. Je fais généralement ces requêtes de "rotation" en utilisant DECODE combiné avec une colonne agrégée, regroupant par ma clé - dans ce cas, votre pseudo-clé, trunc(ID/100). Combinez cela avec la syntaxe de mise à jour qui utilise des tuples :
UPDATE Foo
SET (a, b, c, d)
= (w, x, y, z);
et vous obtenez :
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>;