Limiterò le mie critiche per dire che il design del tuo tavolo non è normalizzato e non è molto carino, ma presumo che tu abbia le tue ragioni. In genere eseguo queste query di "rotazione" utilizzando DECODE combinato con una colonna aggregata, raggruppando in base alla mia chiave, in questo caso, la tua pseudo-chiave, trunc(ID/100). Combinalo con la sintassi di aggiornamento che utilizza le tuple:
UPDATE Foo
SET (a, b, c, d)
= (w, x, y, z);
e ottieni:
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>;