Du bör kunna göra detta med en korrelerad underfråga
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')
Problemet med UPDATE
som du har skrivit är att Oracle inte kan garantera att det finns exakt 1 tbl2.c
värde som motsvarar en enda tbl1.b
värde. Om det finns flera rader i tbl2
för en viss rad i tbl1
, kommer den korrelerade uppdateringen att ge ett fel som indikerar att en enkelrads underfråga returnerade flera rader. I så fall måste du lägga till lite logik i underfrågan för att ange vilken rad från tbl2
att använda i så fall.