Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle 10g PL/SQL- Selecione os resultados como valores de coluna de atualização


Vou limitar minha crítica a dizer que o design da sua mesa não está normalizado, e não é muito bonito, mas suponho que você tenha seus motivos. Eu normalmente faço essas consultas de "rotação" usando DECODE combinado com uma coluna agregada, agrupando por minha chave - neste caso, sua pseudo-chave, trunc(ID/100). Combine isso com a sintaxe de atualização que usa tuplas:
 UPDATE Foo
    SET (a, b, c, d)
      = (w, x, y, z);

e você obtém:
  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>;