【问题标题】:How to update a column pertaining to MySQL table with values from another column in another table using inner join?如何使用内部联接使用另一个表中另一列的值更新与 MySQL 表有关的列?
【发布时间】:2019-05-27 23:02:44
【问题描述】:

事件表(初始):

状态表:

table ready_reason:

表延迟原因:

表备用原因:

倒台原因:

需要的输出

所以基本上,我必须将事件表中状态代码和原因代码列中的值替换为下表中的相应值。

我尝试了各种内部连接的排列和组合。然而,破解不了。希望有任何见解。

我的更新状态码列的代码(没用):

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

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

【问题讨论】:

  • 提示:使用JOIN,不要更改表!您只需生成结果集所需的内容。
  • 其他所有的表都是静态数据吗?一种方法是使用 CASE 并对值进行硬编码,这不是最优雅的方法,但如果这是一次性的事情,它可能是一个可行的解决方案。

标签: mysql sql


【解决方案1】:

在“原因”表上使用 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】:

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

    下面的示例在原因表上使用 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
    

    测试 dbfiddle 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`
    

    【讨论】:

    • 问题是针对 MySql 但您的答案是针对 Sql Server
    • 噢!哦,好吧,这很容易解决。
    【解决方案3】:

    使用连接,例如,我使用上面的 2 个表连接,你完成所有表连接,如下所示

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

    【讨论】:

    • 这并不能解决任何问题,你还是要看列的内容
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2014-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-30
      • 1970-01-01
      • 2012-09-15
      • 1970-01-01
      相关资源
      最近更新 更多