有什么方法可以对 SQL 执行某种“WITH...UPDATE
”操作吗?
例如:
WITH changes AS
(...)
UPDATE table
SET id = changes.target
FROM table INNER JOIN changes ON table.id = changes.base
WHERE table.id = changes.base;
一些上下文信息:我正在尝试做的是从一个表中生成一个base
/target
列表,然后使用它来更改另一个表中的值(将等于 base
的值更改为 target
)
谢谢!
最佳答案
您可以使用 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;
如果我创建带有 id
列的 t42
表,并且包含值为 1、2 和 3 的行,这会将前两个更新为 10 和 20,并且别管第三个。
不一定非得是rowid
,如果唯一标识行,可以是真正的列;通常这将是一个 id
,它通常永远不会改变(作为主键),您只是不能同时使用它和更新它。
关于SQL 与...更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17302824/