Oracle
 sql >> Base de données >  >> RDS >> Oracle

Oracle - jointure de mise à jour - table sans clé préservée

Vous devriez pouvoir le faire avec une sous-requête corrélée

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')

Le problème avec la UPDATE que vous avez écrit est qu'Oracle ne peut pas garantir qu'il y a exactement 1 tbl2.c valeur qui correspond à un seul tbl1.b valeur. S'il y a plusieurs lignes dans tbl2 pour une ligne particulière dans tbl1 , la mise à jour corrélée va générer une erreur indiquant qu'une sous-requête à une seule ligne a renvoyé plusieurs lignes. Dans ce cas, vous devez ajouter une logique à la sous-requête pour spécifier quelle ligne de tbl2 à utiliser dans ce cas.