[英]How to update a column pertaining to MySQL table with values from another column in another table using inner join?
事件表(初始):
状态表:
表ready_reason:
表delay_reason:
表spare_reason:
表down_reason:
所需输出
因此,基本上,我必须用下表中的相应值替换事件表中状态列和原因码列中的值。
我尝试了各种内部组合的排列和组合。 但是,无法破解。 将不胜感激。
我的代码来更新状态代码列(无效):
update event eve
set eve.status_code = sta.name
inner join status sta on eve.status_code = sta.status_code
由于事件表中的reason_ code列需要使用多个表进行更新,因此我无法为此代码提供代码
无需将名称更新为代码字段,而是可以创建视图。
下面的示例在原因表上使用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 <>小提琴测试这里
好吧,我想您可以使用视图来更新表本身。
但这可能不是最好的主意。
update `event` ev
join `vwEvent` vw on vw.EventId = ev.EventId
set ev.`Status Code` = vw.`Status Name`,
ev.`Reason Code` = vw.`Reason Name`
使用“原因”表上的LEFT JOIN和这些表的name
列上的COALESCE进行更新
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)
使用连接,例如,我从上面使用了2个表连接,就可以像下面这样用普通列完成所有表连接
SELECT * FROM Event table e LEFT JOIN status s ON e.status_code=s.status_code
假设表中的值是静态的,则以下代码可以基于MySQL中的CASE-WHEN更新。
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.