Powinieneś być w stanie to zrobić za pomocą skorelowanego podzapytania
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')
Problem z UPDATE
napisałeś, że Oracle nie może zagwarantować, że istnieje dokładnie 1 tbl2.c
wartość odpowiadająca pojedynczej tbl1.b
wartość. Jeśli istnieje wiele wierszy w tbl2
dla dowolnego wiersza w tbl1
, skorelowana aktualizacja zgłosi błąd wskazujący, że jednowierszowe podzapytanie zwróciło wiele wierszy. W takim przypadku musisz dodać trochę logiki do podzapytania, aby określić, który wiersz z tbl2
użyć w takim przypadku.