SQL 与...更新

标签 sql oracle sql-update with-statement

有什么方法可以对 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,并且别管第三个。

SQL Fiddle demo .

不一定非得是rowid,如果唯一标识行,可以是真正的列;通常这将是一个 id,它通常永远不会改变(作为主键),您只是不能同时使用它和更新它。

关于SQL 与...更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17302824/

相关文章:

sql - Oracle 正则表达式列出两个字符串之间的唯一字符差异

sql - 用行号更新 Oracle 表列

javascript - 使用文本框使用php表单更新MySQL数据库

sql - 从 postgres 中的多行临时表更新表

python - 是否有可能使用 Python 标准库(比如 2.5 版)执行参数化的 MS-SQL 查询?

SQL 通过连接插入值

java - 在 PL/SQL 中复制 Java 的 Base64 解码

c# - Entity Framework -与Oracle和SQL Server交互

mysql - 如何使用 where 子句进行 UPSERT

sql - Access 分区数据查询并对每个分区求和?