sql >> Databasteknik >  >> RDS >> Oracle

Använder WITH- och UPDATE-satser i samma SQL-fråga

Du kan använda en with-sats i en uppdatering; du behöver bara göra det på rätt ställe:

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

Men du vill förmodligen bara uppdatera rader som finns i den tillfälliga underfrågan, så du skulle behöva en extra where-klausul:

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

Alternativt kan du använda en MERGE-sats:

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;

N.B. du måste gå med i den faktiska tabellen i källfrågan för merge-satsen eftersom du försöker uppdatera kolumnen som ansluts till, vilket du inte kan göra i en merge-sats - därför har jag bytt sammanfogningen till gå med på mytable.rowid.

Du måste testa båda påståendena för att se vilken som ger bäst resultat på dina data.



  1. DevOps Databas Ordlista för MySQL-nybörjaren

  2. Kunde inte öppna databasen i läs/skrivläge

  3. Vila dialekt för MySQL 8?

  4. SQL Sammanfoga tabeller på tid mellan start och slut