Saya akan membatasi kritik saya untuk mengatakan bahwa desain tabel Anda tidak dinormalisasi, dan tidak terlalu cantik, tetapi saya akan menganggap Anda memiliki alasan. Saya biasanya melakukan kueri "rotasi" ini dengan menggunakan DECODE yang dikombinasikan dengan kolom agregat, dikelompokkan berdasarkan kunci saya - dalam hal ini, kunci semu Anda, trunc(ID/100). Gabungkan itu dengan sintaks pembaruan yang menggunakan tupel:
UPDATE Foo
SET (a, b, c, d)
= (w, x, y, z);
dan Anda mendapatkan:
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>;