跨表更新,Mysql Update Join

背景

項目新導入了一批人員數(shù)據(jù),這些人的有的部門名稱發(fā)生了變化,有的聯(lián)系方式發(fā)生了變化,暫且稱該表為t_dept_members, 系統(tǒng)中有另外一張表 t_user_info 記錄了人員信息。

要求將 t_dept_members 中有變化的信息更新到 t_user 表中,這個需求就是「跨表更新」啦

不帶腦子出門的就寫出了下面的 SQL

file

看到身后 DBA 在修仙,想著讓他幫潤色一下,于是發(fā)給了他,然后甩手回來就是這個樣子:

file

看到這個 SQL 語句我都驚呆了,還能這樣寫,咱得查查這是咋回事啊

Mysql Update Join

我們經(jīng)常使用 join 查詢表中具有(在 INNER JOIN 情況下)或可能沒有(在 LEFT JOIN 情況下)另一個表中匹配行的表中的行。

同樣,在 MySQL 中, 我們也可以在 UPDATE 語句中使用 JOIN 子句執(zhí)行跨表更新,語法就是這樣:

UPDATE T1, T2,
[INNER JOIN | LEFT JOIN] T1 ON T1.C1 = T2. C1
SET T1.C2 = T2.C2,
    T2.C3 = expr
WHERE condition

我們還是詳細的說明一下上面的語法:

首先,在 UPDATE 子句之后,指定主表(T1)和希望主表聯(lián)接到的表(T2)。請注意,必須在UPDATE 子句之后至少指定一個表
接下來,指定你要使用的聯(lián)接類型,即 INNER JOIN 或 LEFT JOIN 以及聯(lián)接謂詞。 JOIN子句必須出現(xiàn)在 UPDATE 子句之后(這個大家都是知道的哈)

然后,將新值分配給要更新的 T1或 T2 表中的列

最后,在 WHERE 子句中指定一個條件以將行限制為要更新的行

如果你遵循 update 語法,你會發(fā)現(xiàn)有另外一種語法也可以完成跨表更新

UPDATE T1, T2
SET T1.c2 = T2.c2,
      T2.c3 = expr
WHERE T1.c1 = T2.c1 AND condition

上面的語法其實隱式使用了 inner join 關鍵字,完全等同于下面的樣子:

UPDATE T1,T2
INNER JOIN T2 ON T1.C1 = T2.C1
SET T1.C2 = T2.C2,
      T2.C3 = expr
WHERE condition

Update Join 例子

年底了,又到了評績效的時候了,聽說要根據(jù) KPI 調(diào)工資了。有兩張表

第一張表「employees-員工表」

file

第二張表「merits-績效字典表」

file

數(shù)據(jù)如下

file

調(diào)薪規(guī)則:原有薪資 + (原有薪資 * 當前績效對應的調(diào)薪百分比)

按照調(diào)薪規(guī)則寫 update 語句:

UPDATE employees
    INNER JOIN
    merits ON employees.performance = merits.performance
SET salary = salary + salary * percentage;

臨近年底,公司又來了兩位新同事, 但是公司年度績效已經(jīng)評完,所以新員工績效為 NULL

INSERT INTO employees(employee_name, performance, salary)
VALUES ('馮大', NULL, 8000),
       ('馮二', NULL, 5000);

新員工工作干的不錯,也要 1.5% 漲點工資的。如果我們還是用 UPDATE INNER JOIN,按照上面的更新語句是不可能完成的,因為條件等式不成立,這是我們就要用到 UPDATE LEFT JOIN 了

UPDATE employees
    LEFT JOIN
    merits ON employees.performance = merits.performance
SET salary = salary + salary * 0.015
WHERE merits.percentage IS NULL;

到這里,新員工的漲薪工作也做完

轉(zhuǎn)自:https://dayarch.top/p/mysql-cross-table-update.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容