Tôi sẽ giới hạn những lời chỉ trích của mình khi nói rằng thiết kế bàn của bạn không được chuẩn hóa và không đẹp lắm, nhưng tôi sẽ cho rằng bạn có lý do của mình. Tôi thường thực hiện các truy vấn "xoay vòng" này bằng cách sử dụng DECODE kết hợp với cột tổng hợp, nhóm theo khóa của tôi - trong trường hợp này là khóa giả của bạn, trunc (ID / 100). Kết hợp điều đó với cú pháp cập nhật sử dụng bộ giá trị:
UPDATE Foo
SET (a, b, c, d)
= (w, x, y, z);
và bạn nhận được:
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>;