Debería poder hacer esto con una subconsulta correlacionada
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')
El problema con la UPDATE
que ha escrito es que Oracle no puede garantizar que haya exactamente 1 tbl2.c
valor que corresponde a un solo tbl1.b
valor. Si hay varias filas en tbl2
para cualquier fila en particular en tbl1
, la actualización correlacionada arrojará un error que indica que una subconsulta de una sola fila devolvió varias filas. En ese caso, necesitaría agregar algo de lógica a la subconsulta para especificar qué fila de tbl2
para usar en ese caso.