sql >> Database teknologi >  >> RDS >> Oracle

Brug af WITH- og UPDATE-sætninger i den samme SQL-forespørgsel

Du kan bruge en with-klausul i en opdatering; du skal bare gøre det det rigtige sted:

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

Du vil dog sandsynligvis kun opdatere rækker, der findes i den midlertidige underforespørgsel, så du skal bruge en ekstra 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 bruge en MERGE-sætning:

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 skal slutte dig til den faktiske tabel i kildeforespørgslen til flettesætningen, fordi du forsøger at opdatere den kolonne, der sammenføjes på, hvilket du ikke kan gøre i en flettesætning - derfor har jeg ændret flettesammenføjningen til deltag på mytable.rowid.

Du skal teste begge udsagn for at se, hvilken der er mest effektiv på dine data.



  1. Hvordan opretter man forbindelse til lokal vært ved hjælp af JDBC?

  2. Fuld forståelse for PDO ATTR_PERSISTENT

  3. Hvordan får man adgang til Oracle-databasen over netværket?

  4. PDO FETCH_CLASS med sammenføjede tabeller