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