Обновление MySQL с помощью подзапроса в безопасном режиме обновления

0

У меня есть следующая база данных: Изображение 174551. Следующий запрос вычисляет общую сумму, которая исходит из умножения цен на продукты и соответствующего количества, из заказов, для которых поле суммы равно NULL:

SELECT SUM(i.qtde * p.preco_unitario) FROM Produtos p
    INNER JOIN ItensPedido i ON i.id_produto = p.id_produto
    INNER JOIN Pedidos pd ON pd.id_pedido = i.id_pedido
    WHERE pd.vlr_total IS NULL
    GROUP BY i.id_pedido);

Я могу обновить строку в таблице Pedidos, используя следующий запрос:

UPDATE Pedidos p 
SET p.vlr_total = (SELECT SUM(i.qtde * p.preco_unitario) FROM Produtos p
    INNER JOIN ItensPedido i ON i.id_produto = p.id_produto
    WHERE i.id_pedido = 1
    GROUP BY i.id_pedido)
WHERE p.id_pedido = 1;

Но мне нужно повторно запустить этот запрос для каждой строки, которую я хочу обновить, изменив два предложения WHERE.

Мне нужна помощь в создании запроса, который обновляет все реестры с суммой NULL, используя один запрос (если это возможно), аналогичный второму. Моя попытка использования первого запроса в качестве подзапроса дает ошибку 1093: использование той же целевой таблицы в обновлении в подзапросе.

Теги:
database

1 ответ

1
Лучший ответ

Вы должны это сделать, изменив эту строку в вашем подзапросе, и это приведет к тому, что предложение подпрограммы WHERE будет соответствовать вашим записям во внешней таблице.

WHERE i.id_pedido = 1

К

WHERE i.id_pedido = p.id_pedido

Затем вы можете удалить внешний WHERE, если вы действительно не хотите просто ограничивать его p.id_pedido = 1

  • 0
    Спасибо, что сделали свое дело. Такая маленькая деталь. Но я должен добавить, что он не работает с включенным безопасным режимом обновления, что приводит к ошибке 1175. Я должен был отключить это в конфигурации перед выполнением. Есть ли другой способ сделать это с включенным безопасным режимом обновления?
  • 0
    Хороший вопрос. Поскольку безопасный режим (как я понимаю) требует от вас определения конкретных критериев в предложении WHERE. Вы можете обойти это, просто добавив что-то вроде WHERE true или, может быть, WHERE (select = 1) и обмануть это таким образом. (PS, если вы выберете « принять» в ответе, я тоже получу очки). :)
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню