Что касается того, выполняется ли подзапрос дважды, используйте EXPLAIN PLAN.
Мне нравится использовать команду слияния вместо обновления для этих связанных обновлений, что-то вроде: (Не проверено, если вы хотите проверитьответьте, пожалуйста, укажите DDL и вставьте операторы.)
merge into table_a TRGT
using (select P.prov_id, N.enc_id, trunc(n.note_time) as trunc_note_time
from note N
inner join provider P ON N.author_id=P.user_id) SRC
on (TRGT.enc_id = SRC.enc_id and TRGT.attr_date = SRC.trunc_note_time)
when matched then update set prov_id = SRC.prov_id
, step = 1
Иногда вы можете обновить встроенное представление, например:
update (select A.prov_id, A.step, P.prov_id as p_prov_id
from note N
inner join provider P on N.author_id=p.user_id
inner join table_a A
on N.enc_id=A.enc_id
and trunc(N.note_time)=A.attr_date)
set prov_id = p_prov_id
, step = 1
Версия встроенного представления не всегда работает.Не могу найти информацию об ошибке, но по сути встроенное представление должно иметь уникальный ключ, который Oracle может привязать к рассматриваемым таблицам.