sql >> Databáze >  >> RDS >> Oracle

Použití příkazů WITH a UPDATE ve stejném dotazu SQL

V aktualizaci můžete použít klauzuli with; jen to musíte udělat na správném místě:

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

Pravděpodobně však chcete aktualizovat pouze řádky, které existují v dočasném poddotazu, takže budete potřebovat další klauzuli where:

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

Případně použijte příkaz MERGE:

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. musíte se připojit ke skutečné tabulce ve zdrojovém dotazu příkazu sloučení, protože se pokoušíte aktualizovat sloupec, ke kterému se připojuje, což nemůžete udělat v příkazu sloučení - proto jsem přepnul spojení sloučení na připojte se na mytable.rowid.

Budete muset otestovat oba příkazy, abyste zjistili, který z nich je ve vašich datech nejvýkonnější.



  1. Alternativa k EntityFunctions.AddSeconds pro MySQL

  2. Výkon dávkového vkládání JDBC

  3. Měříte výkon serveru SQL pomocí těchto metrik?

  4. Může někdo vysvětlit, jak spolu souvisí role Postgresql, uživatelé Postgresql a uživatelé Linuxu?