sql—如何使用内部联接用另一个表中另一列的值更新属于mysql表的列?

pexxcrt2  于 2021-06-17  发布在  Mysql
关注(0)|答案(4)|浏览(375)

事件表(初始):

状态表:

表就绪原因:

表延迟原因:

表备用原因:

下表原因:

所需输出

所以基本上,我必须用下表中相应的值替换事件表中status code和reason code列中的值。
我尝试了各种内部连接的排列和组合。但是,我无法破解它。如有任何见解,我将不胜感激。
我的代码更新状态代码列(不起作用):

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

由于事件表中的reason\code列需要使用多个表进行更新,所以我无法为这一列提供代码

pnwntuvh

pnwntuvh1#

您可以创建一个视图,而不是更新代码字段的名称。
下面的示例在reason表上使用left join,然后合并reason名称。

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 here
嗯,我想您可以使用视图来更新表本身。
但这可能不是最好的主意。

update `event` ev
join `vwEvent` vw on vw.EventId = ev.EventId
set ev.`Status Code` = vw.`Status Name`,
    ev.`Reason Code` = vw.`Reason Name`
68de4m5k

68de4m5k2#

在“reason”表上使用左连接进行更新,并在 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)
zte4gxcn

zte4gxcn3#

使用连接例如我是使用2表连接从上面你完成所有表连接与共同列如下

SELECT * FROM Event table e LEFT JOIN status s ON e.status_code=s.status_code
lsmd5eda

lsmd5eda4#

假设表中的值是静态的,下面的代码可以在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)

相关问题