Du burde være i stand til at gøre dette med en korreleret underforespørgsel
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')
Problemet med UPDATE
det du har skrevet er, at Oracle ikke kan garantere, at der er præcis 1 tbl2.c
værdi, der svarer til en enkelt tbl1.b
værdi. Hvis der er flere rækker i tbl2
for en bestemt række i tbl1
, vil den korrelerede opdatering afgive en fejl, der indikerer, at en enkelt-række-underforespørgsel returnerede flere rækker. I så fald skal du tilføje noget logik til underforespørgslen for at angive, hvilken række fra tbl2
at bruge i så fald.