使用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
子句。