Tôi giả sử khi bạn đặt lại câu hỏi, bạn muốn cú pháp sẽ hoạt động trên cả Oracle và SQL Server mặc dù chắc chắn nó sẽ chỉ ảnh hưởng đến một bảng.
Mức đầu vào Mã chuẩn SQL-92 được hỗ trợ bởi cả hai nền tảng, do đó, mã SQL-92 'truy vấn con vô hướng' sau đây sẽ hoạt động:
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
);
Lưu ý rằng trong khi sử dụng tên tương quan t1
cho Ttble1
là cú pháp hợp lệ theo Tiêu chuẩn SQL-92, điều này sẽ hiện thực hóa một bảng và UPDATE
sau đó sẽ nhắm mục tiêu bảng cụ thể hóa 't1' và để bảng cơ sở của bạn 'table1` không bị ảnh hưởng, mà tôi cho rằng không bị ảnh hưởng mong muốn. Mặc dù tôi khá chắc chắn rằng cả Oracle và SQL Server đều không tuân thủ về vấn đề này và trong thực tế sẽ hoạt động như mong đợi, nhưng không có hại gì khi cực kỳ thận trọng và tuân theo cú pháp SQL-92 bằng cách hoàn toàn đủ điều kiện cho bảng mục tiêu.
Dân gian có xu hướng không thích mã 'lặp lại' trong các truy vấn phụ ở trên (mặc dù trình tối ưu hóa phải đủ thông minh để đánh giá nó chỉ một lần).
Các phiên bản mới hơn của Oracle và SQL Server đều hỗ trợ SQL Chuẩn:2003 MERGE
cú pháp, có thể có thể sử dụng một cái gì đó gần với điều này:
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;
Tôi chỉ nhận thấy rằng ví dụ của bạn thậm chí còn đơn giản hơn tôi nghĩ lúc đầu và chỉ yêu cầu một truy vấn con đơn giản sẽ chạy trên hầu hết các sản phẩm SQL, ví dụ:
UPDATE table1
SET my_value = 'foo'
WHERE EXISTS (
SELECT *
FROM table2 AS t2
WHERE t2.tab1_id = table1.id
);