MySQL: как обновить запрос на основе SELECT Query - PullRequest
0 голосов
/ 11 декабря 2019

У меня следующий запрос SQL, который выполняет массовое обновление на сервере MySQL:

UPDATE res_booking AS rbg
SET rbg.host_id = (
    SELECT vw.entity_id FROM res_booking AS rb
    INNER JOIN pass_single as ps ON (ps.book_id = rb.booking_id)
    INNER JOIN voucher_who as vw ON (vw.pass_id = ps.pass_id)
    WHERE rb.booking_id = rbg.booking_id
)
WHERE rbg.host_id IS NULL;

При его выполнении выдается следующая ошибка:

Error Code: 1093. You can't specify target table 'rbg' for update in FROM clause

Как этот запрос можно переписатьтак будет работать?

Ответы [ 2 ]

1 голос
/ 11 декабря 2019

Я бы написал это как объединение обновлений:

UPDATE res_booking AS rbg
INNER JOIN res_booking AS rb
    ON rb.booking_id = rbg.booking_id
INNER JOIN pass_single AS ps
    ON ps.book_id = rb.booking_id
INNER JOIN voucher_who AS vw
    ON vw.pass_id = ps.pass_id
SET
    rbg.host_id = vw.entity_id
WHERE
    rbg.host_id IS NULL;

Технически само соединение на res_booking должно быть левым соединением, потому что ваше текущее обновление всегда будет назначаться каждой записи, независимо от того, илине подзапрос возвращает значение. Тем не менее, я подозреваю, что логика внутреннего соединения - это то, что вы действительно хотите здесь.

0 голосов
/ 11 декабря 2019

Вы можете использовать коррелированный подзапрос. Просто оставьте res_booking вне подзапроса:

UPDATE res_booking rbg
    SET rbg.host_id = (SELECT vw.entity_id
                       FROM pass_single ps JOIN
                            voucher_who vw
                            ON vw.pass_id = ps.pass_id
                       WHERE ps.book_id = rbg.booking_id
                      )
    WHERE rbg.host_id IS NULL;

MySQL генерирует ошибку, если вы повторно используете обновляемую таблицу в подзапросе. Однако это не нужно. Просто исправьте предложение корреляции, чтобы использовать таблицу ps.

Обратите внимание, что это может привести к ошибке, если подзапрос возвращает более одной строки. Это хорошо. Если это произойдет, вам необходимо выяснить, как справиться с этой ситуацией.

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