Как обновить столбец, относящийся к таблице MySQL, со значениями из другого столбца в другой таблице, используя внутреннее соединение? - PullRequest
0 голосов
/ 31 декабря 2018

Таблица событий (начальная):

enter image description here

Таблица состояния:

enter image description here

таблица ready_reason:

enter image description here

table delay_reason:

enter image description here

таблица запасная_причина:

enter image description here

таблица_причины:

enter image description here

Требуемый вывод

enter image description here

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

Я перепробовал все виды перестановок и комбинаций внутренних объединений.Однако, не мог взломать это.Буду признателен за любые идеи.

Мой код для обновления столбца кода состояния (не работает):

update event eve
set eve.status_code = sta.name
inner join status sta on eve.status_code = sta.status_code

Поскольку столбец кода причины_ в таблице событий необходимо обновить с использованием нескольких таблиц, яЯ не могу придумать код для этого

Ответы [ 4 ]

0 голосов
/ 01 января 2019

Выполните обновление, используя LEFT JOIN для таблиц «причины» и COALESCE для столбца name из этих таблиц

UPDATE event e 
JOIN status s ON s.status_code = e.status_code
LEFT JOIN ready_reason r ON r.status_code = e.reason_code AND e.status_code = 'R'
LEFT JOIN delay_reason d ON d.status_code = e.reason_code AND e.status_code = 'D1'
LEFT JOIN spare_reason sp ON sp.status_code = e.reason_code 
LEFT JOIN down_reason do ON do.status_code = e.reason_code
SET e.status_code = s.name, e.reason_code = COALESCE(r.name, d.name, sp.name, do.name)
0 голосов
/ 31 декабря 2018

Предполагая, что значения в ваших таблицах являются статическими, следующий код может обновить базу на CASE-WHEN в MySQL.

update event eve
set eve.status_code = (SELECT name from status_table WHERE status_code = eve.status_code), eve.reason_code =   CASE

WHEN eve.status_code = 'R' THEN (SELECT name from ready_reason WHERE status_code = eve.reason_code)

WHEN eve.status_code = 'D1' THEN (SELECT name from delay_reason WHERE status_code = eve.reason_code)

WHEN eve.status_code = 'S' THEN (SELECT name from spare_reason WHERE status_code = eve.reason_code)

WHEN eve.status_code = 'D2' THEN (SELECT name from down_reason WHERE status_code = eve.reason_code)
0 голосов
/ 31 декабря 2018

Вместо обновления имен в полях кода вы можете создать представление.

В приведенном ниже примере используются LEFT JOIN в таблицах причин, а затем COALESCE - имена причин.

CREATE VIEW vwEvent AS
SELECT 
 ev.*, 
 COALESCE(st.Name, ev.`Status Code`) AS `Status Name`, 
 COALESCE(ready.Name, delay.Name, spare.Name, down.Name, ev.`Reason Code`) AS `Reason Name`
FROM `event` ev
LEFT JOIN `status` AS st ON st.`Status Code` = ev.`Status Code`
LEFT JOIN ready_reason AS ready ON (ev.`Status Code` = 'R'  AND ready.`Status Code` = ev.`Reason Code`)
LEFT JOIN delay_reason AS delay ON (ev.`Status Code` = 'D1' AND delay.`Status Code` = ev.`Reason Code`)
LEFT JOIN spare_reason AS spare ON (ev.`Status Code` = 'S'  AND spare.`Status Code` = ev.`Reason Code`)
LEFT JOIN down_reason  AS down  ON (ev.`Status Code` = 'D2' AND down.`Status Code`  = ev.`Reason Code`);

Затем выберите в представлении, чтобы получить имена состояний и причин:

select EventId, Duration, `Status Name`, `Reason Name`
from vwEvent

Тест по db <> fiddle здесь

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

update `event` ev
join `vwEvent` vw on vw.EventId = ev.EventId
set ev.`Status Code` = vw.`Status Name`,
    ev.`Reason Code` = vw.`Reason Name`
0 голосов
/ 31 декабря 2018

использовать соединение, например, я использовал соединение двух таблиц сверху, вы завершаете все соединения таблиц с общим столбцом, как показано ниже

SELECT * FROM Event table e LEFT JOIN status s ON e.status_code=s.status_code  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...