sql >> Base de Datos >  >> RDS >> Oracle

Oracle 10g PL/SQL:seleccione los resultados como valores de columna actualizados

Limitaré mi crítica a decir que el diseño de su mesa no está normalizado y no es muy bonito, pero asumo que tiene sus razones. Por lo general, realizo estas consultas de "rotación" usando DECODE combinado con una columna agregada, agrupando por mi clave; en este caso, su pseudo-clave, trunc (ID/100). Combine eso con la sintaxis de actualización que usa tuplas:

 UPDATE Foo
    SET (a, b, c, d)
      = (w, x, y, z);

y obtienes:

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