2016-10-08 3 views
1

Для школы я получил следующее задание, чтобы обновить данные в базу данных:MySQL UPDATE с необходимым подзапросом

Give all the employees (located into the employee table) who work on a project where the employee "50" (employee code) works on as well a salary raise of 250 euro

Я знаю, что я должен был получить SAL колонки в сотрудника, а затем поднять его 250 евро. В настоящее время я сделал это по следующему запросу.

UPDATE `work` AS work 
INNER JOIN `employee` AS employee ON employee.`CODE` = work.`W_CODE` 
SET employee.`SAL` = (employee.`SAL` + 250) 
WHERE work.`P_CODE` IN (# ....); 

Столбец P_CODE обозначает идентификатор проекта. В таблице work указаны все сотрудник с текущим проектом, над которым они работают.

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

UPDATE `work` AS work 
INNER JOIN `employee` AS employee ON employee.`CODE` = work.`W_CODE` 
SET employee.`SAL` = (employee.`SAL` + 250) 
WHERE work.`P_CODE` IN (SELECT work.`P_CODE` 
         FROM `work` AS work 
         INNER JOIN `employee` AS employee ON `employee`.`CODE` = work.`W_CODE` 
         WHERE employee.`CODE` = "50"); 

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

Error Code: 1093. Table 'work' is specified twice, both as a target for 'UPDATE' and as a separate source for data

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

Вопросы

Как я могу исправить этот запрос, где подзапрос будет работать? Может ли это быть объединено в моем первом соединении?

ответ

1

попробовать, используя различные псевдонимы, например: w1 и w2 для работы сотрудника

UPDATE `work` 
    AS w1 

    INNER JOIN `employee` AS employee 
     on employee.`CODE` = w1.`W_CODE` 

    SET employee.`SAL` = (employee.`SAL` + 250) 

    WHERE w1.`P_CODE` IN (select t.my_code from (
    SELECT w2.`P_CODE` as my_code 
     FROM `work` AS w2 
     INNER JOIN `employee` AS employee 
      ON `employee`.`CODE` = w2.`W_CODE` 
     WHERE employee.`CODE` = "50" 
    ) t) ; 
+0

Он дает «Код ошибки: 1093. Таблица« w1 »указана дважды, как в качестве цели для« ОБНОВЛЕНИЯ », так и как отдельный источник данных. Я даже не понимаю, что происходит. – Bas

+0

У меня есть ответ на форматирование динамической таблицы temp – scaisEdge

+0

Почему 't' там в конце? – Bas

0

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

этот запрос работает нормально, если структура такова:

1) таблица Сотрудник .............. EmpID (P ключ) | workId (клавиша F) | Название | зарплата

2) Рабочий стол ID (P ключ) | Рабочий код

Смежные вопросы