sql >> Base de Datos >  >> RDS >> Oracle

Oracle - unión de actualización - tabla sin clave conservada

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.