Синтаксис WITH, по-видимому, действителен во встроенном представлении, например
UPDATE (WITH comp AS ...
SELECT SomeColumn, ComputedValue FROM t INNER JOIN comp ...)
SET SomeColumn=ComputedValue;
Но в быстрых тестах, которые я делал, это всегда не удавалось с ORA-01732: data manipulation operation not legal on this view
, хотя это удалось, если я переписал, чтобы исключить предложение WITH. Поэтому рефакторинг может помешать способности Oracle гарантировать сохранение ключей.
Вы должны быть в состоянии использовать MERGE. Используя простой пример, который вы опубликовали, для этого даже не требуется предложение WITH:
MERGE INTO mytable t
USING (select *, 42 as ComputedValue from mytable where id = 1) comp
ON (t.id = comp.id)
WHEN MATCHED THEN UPDATE SET SomeColumn=ComputedValue;
Но я понимаю, что у вас есть более сложный подзапрос, который вы хотите выделить. Я думаю, что вы сможете сделать подзапрос в предложении USING
сколь угодно сложным, включив несколько предложений WITH
.