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