Операция обновления и выбора за одной таблицей - PullRequest
0 голосов
/ 27 сентября 2019

Таблица:

|E_NAME|COMPANY|POSITION|SALARY|

Попытка:

UPDATE 
   COMPANY
SET 
   SALARY = SALARY + (SALARY * 0.05)
WHERE 
   ((POSITION = 'DOCTOR' OR POSITION = 'ENGINEER')
   AND SALARY < (SELECT AVG(SALARY) FROM COMPANY))

Ошибка MySQL: таблица «COMPANY» указывается дважды, как в качестве цели для «UPDATE», так и в качествеотдельный источник данных

Ответы [ 2 ]

2 голосов
/ 27 сентября 2019

Оберните средний подзапрос в другой подзапрос, чтобы обойти эту проблему:

UPDATE COMPANY
SET SALARY = SALARY + (0.05 * SALARY)
WHERE
    POSITION IN ('DOCTOR', 'ENGINEER') AND
    SALARY < (SELECT avg_salary FROM
                 (SELECT AVG(SALARY) AS avg_salary FROM COMPANY) x);
0 голосов
/ 27 сентября 2019

Переместите подзапрос к предложению FROM:

UPDATE COMPANY C CROSS JOIN
       (SELECT AVG(SALARY) AS AVG_SALARY FROM COMPANY) a
    SET C.SALARY = C.SALARY + (C.SALARY * 0.05)
WHERE POSITION IN ('DOCTOR', 'ENGINEER') AND
      C.SALARY < a.AVG_SALARY;

Примечание. Возможность ссылаться на обновляемую таблицу является ограничением MySQL.К счастью, он позволяет использовать JOIN с в UPDATE с (и DELETE с).

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