Dovresti essere in grado di farlo con una sottoquery correlata
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')
Il problema con UPDATE quello che hai scritto è che Oracle non può garantire che ci sia esattamente 1 tbl2.c valore che corrisponde a un singolo tbl1.b valore. Se sono presenti più righe in tbl2 per qualsiasi riga particolare in tbl1 , l'aggiornamento correlato genererà un errore che indica che una sottoquery a riga singola ha restituito più righe. In tal caso, dovresti aggiungere della logica alla sottoquery per specificare quale riga da tbl2 da utilizzare in tal caso.