Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Używanie instrukcji WITH i UPDATE w tym samym zapytaniu SQL

Możesz użyć klauzuli with w aktualizacji; po prostu musisz to zrobić we właściwym miejscu:

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

Jednak prawdopodobnie chcesz aktualizować tylko te wiersze, które istnieją w podzapytaniu tymczasowym, więc będziesz potrzebować dodatkowej 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);

Alternatywnie użyj instrukcji 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;

Uwaga musisz dołączyć do rzeczywistej tabeli w zapytaniu źródłowym instrukcji scalania, ponieważ próbujesz zaktualizować kolumnę, na której jest łączona, czego nie możesz zrobić w instrukcji scalania - dlatego przestawiłem łączenie scalające na dołącz do mytable.rowid.

Musisz przetestować oba stwierdzenia, aby zobaczyć, które z nich jest najskuteczniejsze w przypadku Twoich danych.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zmień tabelę, dodaj kolumnę / ORA-00984:kolumna niedozwolona tutaj PLSQL

  2. Zbyt mały bufor do konwersji CLOB na CHAR lub BLOB na RAW

  3. Rozwiązanie problemu Drop Column Bug w Oracle 18c i 19c

  4. Uszkodzenie daty Oracle podczas aktualizacji

  5. Dynamiczny DESC i ASC Oracle w kolejności do