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

如何使用内部联接使用另一个表中另一列的值更新属于MySQL表的列?,mysql,sql,Mysql,Sql,事件表(首字母): 状态表: 表1准备就绪原因: 表延迟原因: 表1备用单元原因: 下表列出原因: 所需输出 因此,基本上,我必须用下表中相应的值替换事件表中状态代码和原因代码列中的值 我尝试了各种内部连接的排列和组合。然而,我无法破解它。如果您有任何见解,我将不胜感激 更新状态代码列的我的代码(不起作用): 由于事件表中的“原因代码”列需要使用多个表进行更新,因此我无法为这一列提供代码。例如,我使用了上面的2个表联接。您可以使用下面的公共列完成所有表联接 SELECT * FRO

事件表(首字母):

状态表:

表1准备就绪原因:

表延迟原因:

表1备用单元原因:

下表列出原因:

所需输出

因此,基本上,我必须用下表中相应的值替换事件表中状态代码和原因代码列中的值

我尝试了各种内部连接的排列和组合。然而,我无法破解它。如果您有任何见解,我将不胜感激

更新状态代码列的我的代码(不起作用):


由于事件表中的“原因代码”列需要使用多个表进行更新,因此我无法为这一列提供代码。例如,我使用了上面的2个表联接。您可以使用下面的公共列完成所有表联接

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

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

您可以创建一个视图,而不是更新代码字段的名称

下面的示例在原因表上使用左连接,然后在原因名称上使用联合。

然后从视图中选择以获取状态和原因名称:

select EventId, Duration, `Status Name`, `Reason Name`
from vwEvent
dbfiddle测试

嗯,我想您可以使用视图来更新表本身。
但这可能不是最好的主意

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

使用“原因”表上的左连接执行更新,并合并这些表中的
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)

提示:使用
JOIN
并且不要更改表!您只需要为结果集生成所需的内容。所有其他表都填充了静态数据吗?一种方法是使用CASE和硬编码值,这不是最优雅的方法,但如果这是一次性的,可能是可行的解决方案。这并不能解决任何问题,您仍然需要查看专栏的内容。这个问题是针对MySql的,但您的答案是针对Sql ServerDoh的!哦,那很容易解决。
update `event` ev
join `vwEvent` vw on vw.EventId = ev.EventId
set ev.`Status Code` = vw.`Status Name`,
    ev.`Reason Code` = vw.`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)