SQL - # 1093 - Таблица '' указана дважды, как в качестве цели для 'ОБНОВЛЕНИЯ', так и в качестве отдельного источника данных - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть этот код:

UPDATE WORLD_TEST 
SET PROGRAMMER = (SELECT (RECURSE_HOUR/360) 
                  FROM WORLD_TEST_PROGRAMMER, WORLD_TEST 
                  WHERE LVL = LVL_PROGRAMMER) 
WHERE (SELECT MAX_RECURSE 
       FROM WORLD_TEST_PROGRAMMER, WORLD_TEST 
       WHERE LVL = LVL_PROGRAMMER) 
>= 
(PROGRAMMER+(SELECT (RECURSE_HOUR/360) 
             FROM WORLD_TEST_PROGRAMMER, WORLD_TEST 
             WHERE LVL = LVL_PROGRAMMER));

С этой ошибкой:

1093 - Таблица «WORLD_TEST» указывается дважды, как в качестве цели для «UPDATE», так и в качестве отдельного источника для данных

РЕДАКТИРОВАТЬ (уточнение из комментариев): PROGRAMMER и LVL_PROGRAMMER из таблицы WORLD_TEST, а RECURSE_HOUR, LVL, MAX_RECURSE из таблицы WORLD_TEST_PROGRAMMER.

1 Ответ

0 голосов
/ 09 ноября 2018

Сообщение об ошибке совершенно ясно, что вы не можете использовать ту же таблицу в предложении UPDATE, а также источник подзапроса. Есть и другие способы достижения этого, например использование производных таблиц и т. Д. В этом конкретном случае вам просто нужно JOIN между двумя таблицами.

Также, пожалуйста, не используйте Старые неявные объединения на основе запятой и переключитесь на Современный Явный Join синтаксис на основе

В случае многостоловых запросов рекомендуется использовать Псевдоним для удобочитаемости кода и предотвращения неоднозначного поведения.

Исходя из ваших дальнейших разъяснений в комментариях , попробуйте следующее:

UPDATE WORLD_TEST AS wt 
JOIN WORLD_TEST_PROGRAMMER AS wtp 
  ON wt.LVL_PROGRAMMER = wtp.LVL 
SET wt.PROGRAMMER = wtp.RECURSE_HOUR
WHERE wtp.MAX_RECURSE >= (wt.PROGRAMMER + (wtp.RECURSE_HOUR/360))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...