Je zou dit moeten kunnen doen met een gecorreleerde subquery
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')
Het probleem met de UPDATE
dat u hebt geschreven is dat Oracle niet kan garanderen dat er precies 1 tbl2.c
. is waarde die overeenkomt met een enkele tbl1.b
waarde. Als er meerdere rijen zijn in tbl2
voor een bepaalde rij in tbl1
, zal de gecorreleerde update een fout genereren die aangeeft dat een subquery met één rij meerdere rijen heeft geretourneerd. In dat geval moet u wat logica aan de subquery toevoegen om aan te geven welke rij uit tbl2
om in dat geval te gebruiken.