Oracle
 sql >> Base de données >  >> RDS >> Oracle

Oracle 10g PL/SQL - Sélectionnez les résultats en tant que valeurs de colonne de mise à jour

Je limiterai ma critique à dire que la conception de votre table n'est pas normalisée et n'est pas très jolie, mais je suppose que vous avez vos raisons. Je fais généralement ces requêtes de "rotation" en utilisant DECODE combiné avec une colonne agrégée, regroupant par ma clé - dans ce cas, votre pseudo-clé, trunc(ID/100). Combinez cela avec la syntaxe de mise à jour qui utilise des tuples :

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

et vous obtenez :

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