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.