簡體   English   中英

如何使用內部聯接用另一個表中另一列的值更新與MySQL表有關的列?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM