带有内部联接的 Oracle 更新语句

Posted

技术标签:

【中文标题】带有内部联接的 Oracle 更新语句【英文标题】:Oracle Update statement with an Inner Join 【发布时间】:2011-12-01 15:13:19 【问题描述】:

我正在尝试使用内部连接编写一个简单的更新语句,但我在 SQL Server 中执行此操作的方式似乎不适用于 ORACLE。这是更新:

UPDATE D
SET D.USER_ID = C.USER_ID
FROM D INNER JOIN C 
ON D.MGR_CD = C.MGR_CD WHERE D.USER_ID IS NULL;

看来我遇到的错误是在FROM 上。有人可以解释一下这是什么原因以及如何解决它吗?

【问题讨论】:

【参考方案1】:

在 Oracle 中,您不能以这种方式在 update statement 中使用 from 子句。以下任何一项都应该有效。

UPDATE d
SET    d.user_id   =
          (SELECT c.user_id
           FROM   c
           WHERE  d.mgr_cd = c.mgr_cd)
WHERE  d.user_id IS NULL;

UPDATE (SELECT d.user_id AS d_user_id, c.user_id AS c_user_id
        FROM   d INNER JOIN c ON d.mgr_cd = c.mgr_cd
        WHERE  d.user_id IS NULL)
SET    d_user_id   = c_user_id;

UPDATE (SELECT d.user_id AS d_user_id, c.user_id AS c_user_id
        FROM   d INNER JOIN c ON d.mgr_cd = c.mgr_cd)
SET    d_user_id   = c_user_id
WHERE  d_user_id IS NULL;

但是,我更喜欢在这种情况下使用MERGE

MERGE INTO d
USING      c
ON         (d.mgr_cd = c.mgr_cd)
WHEN MATCHED THEN
    UPDATE SET d.user_id = c.user_id
        WHERE      d.user_id IS NULL;

【讨论】:

以上是关于带有内部联接的 Oracle 更新语句的主要内容,如果未能解决你的问题,请参考以下文章

带有内部联接和子查询的 Microsoft Access 更新语句

带有内部联接的 SQL 更新查询语法

带有子查询的 Oracle 更新 - 性能问题

在 select 语句中使用连接的 Oracle 更新

带有内部联接的sql更新和位置

带有内部联接的 SQL Server 更新