Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle 10g PL/SQL- Wählen Sie Ergebnisse als Update-Spaltenwerte aus

Ich beschränke meine Kritik darauf, dass Ihr Tabellendesign nicht normalisiert und nicht sehr hübsch ist, aber ich nehme an, Sie haben Ihre Gründe. Normalerweise mache ich diese "Rotations"-Abfragen, indem ich DECODE in Kombination mit einer aggregierten Spalte verwende und nach meinem Schlüssel gruppiere - in diesem Fall Ihrem Pseudoschlüssel, trunc(ID/100). Kombinieren Sie das mit der Update-Syntax, die Tupel verwendet:

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

und Sie erhalten:

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