SQL Oracle Обновление, содержащее левое соединение - PullRequest
0 голосов
/ 19 июня 2020

Я хочу выполнить обновление результатов запроса выбора.

SELECT
    a.reason,
    n.note
FROM applications a
LEFT JOIN notes n on n.app_id = a.app_id
    AND n.note LIKE '%old%'
WHERE a.code = 'run' AND a.reason IS NULL

Я думал, что могу выполнить эти обновления отдельно, заключив выборку в обновление, однако я получаю ошибку ORA-01733: virtual столбец здесь не допускается. Как я могу go выполнить эти обновления?

UPDATE (
    SELECT
        a.reason AS Reason
    FROM applications a
    LEFT JOIN notes n on n.app_id = a.app_id
        AND n.note LIKE '%old%'
    WHERE a.code = 'run' AND a.reason IS NULL
) SET Reason = null

UPDATE (
    SELECT
        n.note AS Note
    FROM applications a
    LEFT JOIN notes n on n.app_id = a.app_id
        AND n.note LIKE '%old%'
    WHERE a.code = 'run' AND a.reason IS NULL
) SET Note = null

1 Ответ

1 голос
/ 19 июня 2020

Вы не можете обновлять две таблицы одновременно. Вам понадобятся два разных оператора обновления, а именно:

Обновить таблицу APPLICATIONS довольно просто, поскольку все записи таблицы APPLICATIONS, имеющие a.code = 'run' AND a.reason IS NULL, будут присутствовать в вашем запросе SELECT.

UPDATE APPLICATIONS A
   SET
    REASON = NULL
 WHERE A.CODE = 'run'
   AND A.REASON IS NULL;

Чтобы обновить таблицу NOTES, вы можете использовать предложение EXISTS следующим образом:

UPDATE NOTES N
   SET
    NOTE = NULL
 WHERE EXISTS (
    SELECT 1
      FROM APPLICATIONS A
     WHERE N.APP_ID = A.APP_ID
       AND A.CODE = 'run'
       AND A.REASON IS NULL
)
AND N.NOTE LIKE '%old%'

Сначала необходимо обновить таблицу NOTES, а затем APPLICATIONS поскольку при обновлении таблицы NOTES вы используете условие A. REASON IS NULL, но при обновлении таблицы APPLICATIONS вы обновляете столбец REASON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...