3

WITH...UPDATE有没有办法对 SQL执行某种“ ”操作?

例如:

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列表,然后用它来改变另一个表中的值(改变值等于baseinto target

谢谢!

4

1 回答 1

5

您可以使用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,它通常永远不会改变(作为主键),你不能同时使用它并更新它。

于 2013-06-25T17:07:52.443 回答