Трябва да можете да направите това с корелирана подзаявка
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')
Проблемът с UPDATE
което сте написали е, че Oracle не може да гарантира, че има точно 1 tbl2.c
стойност, която съответства на единичен tbl1.b
стойност. Ако има няколко реда в tbl2
за всеки конкретен ред в tbl1
, свързаната актуализация ще изведе грешка, показваща, че едноредова подзаявка е върнала няколко реда. В този случай ще трябва да добавите някаква логика към подзаявката, за да посочите кой ред от tbl2
да се използва в този случай.