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.