具有内部联接的Oracle Update语句

esa*_*ncy 4 oracle inner-join

我正在尝试使用内部联接编写一个简单的更新语句,但我在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;
Run Code Online (Sandbox Code Playgroud)

似乎我得到的错误是在FROM.有人可以解释,以了解这是什么原因以及如何解决它?

All*_*lan 7

在Oracle中,您不能以这种方式fromupdate语句中使用子句.以下任何一项都应该有效.

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;
Run Code Online (Sandbox Code Playgroud)

但是,我倾向于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;
Run Code Online (Sandbox Code Playgroud)