Оператор обновления Oracle с внутренним соединением - PullRequest
4 голосов
/ 05 октября 2011

Я пытаюсь написать простую инструкцию обновления с внутренним объединением, но способ, которым я сделал бы это на SQL-сервере, похоже, не работает в 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 Ответ

7 голосов
/ 05 октября 2011

В Oracle вы не можете использовать предложение from в выражении update таким образом. Любое из следующего должно работать.

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...