Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle 10g PL/SQL:seleziona i risultati come valori della colonna di aggiornamento

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>;