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

Verwenden von WITH- und UPDATE-Anweisungen in derselben SQL-Abfrage

Sie können eine with-Klausel in einem Update verwenden; Sie müssen es nur an der richtigen Stelle tun:

UPDATE mytable
   SET name = (WITH temp AS((SELECT 'abcd' AS oldvalue, 'defg' AS newvalue FROM dual) UNION
                            (SELECT .....) --About 300 lines of this, copied from Excel and then formatted into the SELECT statement
                           )
               SELECT newvalue
               FROM   temp
               WHERE  mytable.name = temp.oldvalue);

Wahrscheinlich möchten Sie jedoch nur Zeilen aktualisieren, die in der temporären Unterabfrage vorhanden sind, sodass Sie eine zusätzliche where-Klausel benötigen:

UPDATE mytable
   SET name = (WITH temp AS((SELECT 'abcd' AS oldvalue, 'defg' AS newvalue FROM dual) UNION
                            (SELECT .....) --About 300 lines of this, copied from Excel and then formatted into the SELECT statement
                           )
               SELECT newvalue
               FROM   temp
               WHERE  mytable.name = temp.oldvalue)
WHERE  EXISTS (WITH temp AS((SELECT 'abcd' AS oldvalue, 'defg' AS newvalue FROM dual) UNION
                            (SELECT .....) --About 300 lines of this, copied from Excel and then formatted into the SELECT statement
                           )
               SELECT NULL
               FROM   temp
               WHERE  mytable.name = temp.oldvalue);

Verwenden Sie alternativ eine MERGE-Anweisung:

merge into mytable tgt
  using (WITH temp AS((SELECT 'abcd' AS oldvalue, 'defg' AS newvalue FROM dual) UNION
                      (SELECT .....) --About 300 lines of this, copied from Excel and then formatted into the SELECT statement
                     )
         SELECT mytable.rowid r_id,
                temp.newvalue
         FROM   temp
         inner  join mytable on mytable.name = temp.oldvalue) src
    on (tgt.rowid = src.r_id)
when matched then
update set tgt.name = src.newvalue;

Hinweis:Sie müssen in der Quellabfrage der Merge-Anweisung mit der eigentlichen Tabelle verknüpft werden, da Sie versuchen, die Spalte zu aktualisieren, die verknüpft wird, was in einer Merge-Anweisung nicht möglich ist - daher habe ich die Merge-Verknüpfung auf umgestellt join auf mytable.rowid.

Sie müssten beide Anweisungen testen, um zu sehen, welche für Ihre Daten am leistungsstärksten ist.