使用with子句更新语句

我有一个脚本,使用一堆的子句来得到一些结果,然后我想写在一个表中的结果。 我只是无法摆脱困境,有人能指引我走向正确的方向吗?

这是一个简单的例子,表明我想要做什么:

with comp as ( select *, 42 as ComputedValue from mytable where id = 1 ) update t set SomeColumn = c.ComputedValue from mytable t inner join comp c on t.id = c.id 

真正的事情有很多条款都是相互引用的,所以实际上使用with子句的任何build议都比重构嵌套子查询更优先。

提前致谢,

格特 – 扬

如果有人来到我这里,这是对我有用的答案。

 update mytable t set z = ( with comp as ( select b.*, 42 as computed from mytable t where bs_id = 1 ) select c.computed from comp c where c.id = t.id ) 

祝你好运,

GJ

WITH语法在内联视图中似乎是有效的,例如

 UPDATE (WITH comp AS ... SELECT SomeColumn, ComputedValue FROM t INNER JOIN comp ...) SET SomeColumn=ComputedValue; 

但在快速testing中,我这样做总是失败, ORA-01732: data manipulation operation not legal on this view ,尽pipe如果我重写了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子句。