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

Perbarui menggunakan Gabung - Multi DB/Tabel

Saya berasumsi ketika Anda mengajukan kembali pertanyaan Anda menginginkan sintaks yang akan bekerja pada Oracle dan SQL Server meskipun pasti hanya akan mempengaruhi satu tabel.

Entry level SQL-92 Standard code didukung oleh kedua platform, oleh karena itu kode SQL-92 'scalar subqueries' berikut akan berfungsi:

UPDATE table1 
   SET my_value = (
                   SELECT t2.tab1_id
                     FROM table2 AS t2 
                    WHERE t2.tab1_id = table1.id
                  )       
 WHERE id = 1234
       AND EXISTS (
                   SELECT * 
                     FROM table2 AS t2 
                    WHERE t2.tab1_id = table1.id
                  );

Perhatikan bahwa saat menggunakan nama korelasi t1 untuk Ttble1 adalah sintaks yang valid menurut Standar SQL-92 ini akan mewujudkan tabel dan UPDATE kemudian akan menargetkan tabel terwujud 't1' dan membiarkan tabel dasar Anda 'table1` tidak terpengaruh, yang saya anggap bukan pengaruh yang diinginkan. Sementara saya cukup yakin baik Oracle dan SQL Server tidak patuh dalam hal ini dan bahwa dalam praktiknya akan bekerja seperti yang diharapkan, tidak ada salahnya menjadi sangat berhati-hati dan berpegang teguh pada sintaks SQL-92 dengan sepenuhnya memenuhi syarat tabel target.

Orang cenderung tidak menyukai kode 'berulang' dalam subkueri di atas (walaupun pengoptimal harus cukup pintar untuk mengevaluasinya hanya sekali).

Versi Oracle dan SQL Server yang lebih baru mendukung keduanya mendukung SQL Standar:2003 MERGE sintaks, mungkin dapat menggunakan sesuatu yang dekat dengan ini:

MERGE INTO table1 
   USING (
          SELECT t2.tab1_id
            FROM table2 AS t2
         ) AS source
      ON id = source.tab1_id
         AND id = 1234
WHEN MATCHED THEN
   UPDATE
      SET my_value = source.tab1_id;

Saya baru saja memperhatikan contoh Anda bahkan lebih sederhana daripada yang saya pikirkan dan hanya membutuhkan subquery sederhana yang harus dijalankan pada sebagian besar produk SQL, mis.

UPDATE table1
   SET my_value = 'foo'
 WHERE EXISTS (
               SELECT * 
                 FROM table2 AS t2 
                WHERE t2.tab1_id = table1.id
              );


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana Cara Mengekspor-Impor Database di Oracle 11g (Application Express Edition)?

  2. Mengapa Hibernate membuang org.hibernate.exception.LockAcquisitionException?

  3. Mengembalikan parameter dalam pernyataan penyisipan Oracle SQL

  4. Oracle (+) Operator

  5. Penanganan pengecualian dalam Prosedur dengan fungsi bersarang di pl/sql