Oracle
 sql >> база данни >  >> RDS >> Oracle

Използване на изрази WITH и UPDATE в една и съща SQL заявка

Можете да използвате клауза with в актуализация; просто трябва да го направите на правилното място:

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:

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

Като алтернатива използвайте оператор 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. трябва да се присъедините към действителната таблица в изходната заявка на оператора за сливане, защото се опитвате да актуализирате колоната, към която се присъединявате, което не можете да направите в оператор за сливане - затова превключих свързването за сливане на присъединете се към mytable.rowid.

Ще трябва да тествате и двете твърдения, за да видите кое е най-ефективно за вашите данни.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. IN клауза за Oracle Prepared Statement в Python cx_Oracle

  2. Зареждане на данни от *.xlsx или *.xls в таблица на Oracle от потребителски акаунт на Oracle Apex 4.0.2

  3. Имате PL/SQL изходи в реално време

  4. PLS-00428:в този оператор SELECT се очаква клауза INTO

  5. Константи в Oracle SQL заявка