Bạn có thể thực hiện việc này với một truy vấn con có liên quan
UPDATE tbl1 t1
SET t1.b = (SELECT c
FROM tbl2 t2
WHERE t1.id = t2.id
AND t1.a = t2.a
AND t1.b = t2.b
AND t2.d = 'a')
WHERE t1.a = 'foo'
AND EXISTS( SELECT 1
FROM tbl2 t2
WHERE t1.id = t2.id
AND t1.a = t2.a
AND t1.b = t2.b
AND t2.d = 'a')
Sự cố với UPDATE
mà bạn đã viết là Oracle không thể đảm bảo rằng có chính xác 1 tbl2.c
giá trị tương ứng với một tbl1.b
giá trị. Nếu có nhiều hàng trong tbl2
cho bất kỳ hàng cụ thể nào trong tbl1
, bản cập nhật tương quan sẽ gây ra lỗi cho biết rằng một truy vấn con một hàng trả về nhiều hàng. Trong trường hợp đó, bạn cần thêm một số logic vào truy vấn con để chỉ định hàng nào từ tbl2
để sử dụng trong trường hợp đó.