Как выполнить операцию «update set» в базе данных MySQL, при которой одно поле из одной таблицы обновляется на основе значения другого поля в другой таблице, сопоставляя эти поля?

Как исправить ошибку в запросе на MySQL 5.7, которая гласит: "#1093 - Не допускается указание таблицы 'b_uts_crm_company' в списке таблиц FROM для внесения в нее изменений"? Вот сам запрос:
```
UPDATE b_uts_crm_company
SET UF_CRM_1696186645 = (
  SELECT b_crm_company.REVENUE
  FROM b_crm_company
  INNER JOIN b_uts_crm_company ON b_crm_company.ID = b_uts_crm_company.VALUE_ID
)
```
  • 1 октября 2023 г. 20:27
Ответы на вопрос 2
В запросе вы указали таблицу `b_uts_crm_company` в подзапросе, который присваивает значения полю `UF_CRM_1696186645`. В MySQL 5.7 нельзя изменять таблицу, которая используется в подзапросе. Чтобы исправить эту ошибку, вы можете использовать временную таблицу.

Вот исправленный запрос:
```
UPDATE b_uts_crm_company
SET UF_CRM_1696186645 = (
  SELECT t.REVENUE
  FROM (
    SELECT b_crm_company.REVENUE
    FROM b_crm_company
    INNER JOIN b_uts_crm_company ON b_crm_company.ID = b_uts_crm_company.VALUE_ID
  ) AS t
)
```

В этом запросе мы используем подзапрос как источник данных во временной таблице `t`. Затем мы обновляем поле `UF_CRM_1696186645` в таблице `b_uts_crm_company` с помощью значений из временной таблицы `t`.
Подзапрос "знает" о таблице b_uts_crm_company из основного запроса в секции where и использует ее значения в подзапросе.
UPDATE b_uts_crm_company 
SET UF_CRM_1696186645 = (SELECT b_crm_company.REVENUE
                        FROM b_crm_company
                        WHERE b_crm_company.ID = b_uts_crm_company.VALUE_ID)
Подзапрос должен возвращать только одно значение, чтобы корректно выполниться.
Похожие вопросы