Как обновить table1 на основе обновленных значений в таблице 2 - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть две mysql таблицы: проекты и выпуски. Структура таблиц следующая:

Проекты:

+----+-------------+-----------------------------+----------+---------------+
| id | ProjectName | ProjectDescription          | projType | projectStatus |
+----+-------------+-----------------------------+----------+---------------+
|  1 | RA_Surf     | Retail Audit for Surf Excel |        1 |             1 |
|  2 | RA_Nirma    | Retail Audit for Surf Nirma |        1 |             1 |
+----+-------------+-----------------------------+----------+---------------+

Выходы:

+----+------+------+----------------+----------------+-----------------+---
| id | pid  | poid | OutletName     | interviewer | Status | 
+----+------+------+----------------+----------------+-----------------+---
|  1 |    1 |   11 | Ganapathy Entp |           1 |      2 |             
|  2 |    1 |   21 | Suresh Entp    |           1 |      2 |             
|  3 |    2 |   32 | Suresh Entp    |           1 |      1 |             
+----+------+------+----------------+----------------+-----------------+-

PID в торговых точках ссылается на идентификатор в проектах. Я пытаюсь обновить projectStatus в проектах до 2, когда Статус всех розеток в таблице розеток, относящихся к одному и тому же pid, установлен на 2.

В приведенной ниже таблице Статус для розеток уже установлен 2, где pid равен 1. pid 1 относится к первой записи в таблице проектов с идентификатором 1.

Я пробовал следующее:

update projects 
set projectStatus=2 
where id=(
            select projects.id 
            from projects 
                join outlets on projects.id=outlets.pid 
            where Status = 2 
            group by outlets.pid 
            having (count(Status) * 2) = sum(Status)  
            );

Я получаю ошибку ERROR 1093 (HY000): You can't specify target table 'projects' for update in FROM clause

тогда как когда я использую оператор выбора,

select id 
from projects 
where id = (
            select projects.id 
            from projects 
                join outlets on projects.id=outlets.pid 
            where Status = 2 
            group by outlets.pid 
            having (count(Status) * 2) = sum(Status)   
            );

это работает.

Как обновить таблицу, когда состояние всех выходов в проекте обновлено до 2.

1 Ответ

1 голос
/ 05 апреля 2020
UPDATE Projects p
JOIN Outlets o ON p.id = o.pid
SET p.projectStatus = 2
WHERE NOT EXISTS ( SELECT NULL
                   FROM Outlets oo
                   WHERE p.id = oo.pid
                     AND COALESCE(oo.Status, 0) != 2 )

Не могли бы вы помочь мне понять, что делает coalesce

Возможно, что запись в ведомой таблице содержит NULL в проверенном поле. COALESCE () преобразует это специальное значение в значение общего нуля.

Если столбец Outlets.Status определен как NOT NULL в структуре таблицы, тогда использование функции является избыточным, и достаточно простого AND oo.Status != 2.

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