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.