Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Menggunakan pernyataan WITH dan UPDATE dalam kueri SQL yang sama

Anda dapat menggunakan klausa with dalam pembaruan; Anda hanya perlu melakukannya di tempat yang tepat:

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

Namun, Anda mungkin hanya ingin memperbarui baris yang ada di subkueri temp, jadi Anda memerlukan klausa where tambahan:

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

Atau, gunakan pernyataan 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. Anda harus bergabung ke tabel aktual dalam kueri sumber dari pernyataan gabungan karena Anda mencoba memperbarui kolom yang sedang digabungkan, yang tidak dapat Anda lakukan dalam pernyataan gabungan - oleh karena itu saya telah mengalihkan gabungan gabungan ke bergabung di mytable.rowid.

Anda harus menguji kedua pernyataan untuk melihat mana yang paling berkinerja pada data Anda.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kueri Tab Silang Dinamis di Oracle

  2. Bagaimana cara menulis kebijakan di Oracle SQL yang membatasi akses ke non-pemilik untuk sebuah tabel?

  3. Tanggal bulat hingga interval 10 menit

  4. Bagaimana cara memanggil prosedur pengembalian Oracle CURSOR di java

  5. C# DateTime berubah ke format lain