您可以使用merge
, 与您的with
子句等效作为using
子句,但是因为您正在更新要加入的字段,所以需要做更多的工作;这个:
merge into t42
using (
select 1 as base, 10 as target
from dual
) changes
on (t42.id = changes.base)
when matched then
update set t42.id = changes.target;
..给出错误:
ORA-38104: Columns referenced in the ON Clause cannot be updated: "T42"."ID"
当然,这在一定程度上取决于您在 CTE 中所做的事情,但只要您可以加入到您的表内以获得rowid
该子句,您就可以将其用于on
子句:
merge into t42
using (
select t42.id as base, t42.id * 10 as target, t42.rowid as r_id
from t42
where id in (1, 2)
) changes
on (t42.rowid = changes.r_id)
when matched then
update set t42.id = changes.target;
如果我t42
用一id
列创建表并有值为 1、2 和 3 的行,这会将前两个更新为 10 和 20,而不理会第三个。
SQL 小提琴演示。
不一定是rowid
,如果唯一标识行,它可以是真正的列;通常这将是一个id
,它通常永远不会改变(作为主键),你不能同时使用它并更新它。