Měli byste to udělat pomocí korelovaného poddotazu
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')
Problém s UPDATE
že jste napsal, že Oracle nemůže zaručit, že existuje přesně 1 tbl2.c
hodnota, která odpovídá jedinému tbl1.b
hodnota. Pokud je v tbl2
více řádků pro jakýkoli konkrétní řádek v tbl1
, korelovaná aktualizace vyvolá chybu označující, že jednořádkový poddotaz vrátil více řádků. V takovém případě budete muset do poddotazu přidat nějakou logiku, abyste určili, který řádek z tbl2
v takovém případě použít.