请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

跨表更新,Mysql Update Join

[复制链接]
查看: 14|回复: 0

3万

主题

3万

帖子

9万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
92756
发表于 2020-2-15 11:37 | 显示全部楼层 |阅读模式
背景

项目新导入了一批职员数据,这些人的有的部分称号发生了变化,有的联系方式发生了变化,姑且称该表为t_dept_members, 系统中有此外一张表 t_user_info 记载了职员信息。
要求将 t_dept_members 中有变化的信息更新到 t_user 表中,这个需求就是「跨表更新」啦
不带脑子出门的就写出了下面的 SQL
我的关键词 跨表更新,Mysql Update Join  热门消息 1203146-20200215104216006-1681566483

看到死后 DBA 在修仙,想着让他帮润饰一下,因而发给了他,然后甩手归来就是这个样子:
我的关键词 跨表更新,Mysql Update Join  热门消息 1203146-20200215104216305-612087446

看到这个 SQL 语句我都惊呆了,还能这样写,咱得查查这是咋回事啊
Mysql Update Join

我们经常利用 join 查询表中具有(在 INNER JOIN 情况下)或能够没有(在 LEFT JOIN 情况下)另一个表中婚配行的表中的行。
一样,在 MySQL 中, 我们也可以在 UPDATE 语句中利用 JOIN 子句履行跨表更新,语法就是这样:
  1. UPDATE T1, T2,[INNER JOIN | LEFT JOIN] T1 ON T1.C1 = T2. C1SET T1.C2 = T2.C2,    T2.C3 = exprWHERE condition
复制代码
我们照旧具体的说明一下上面的语法:
首先,在 UPDATE 子句以后,指定主表(T1)和渴望主表连接到的表(T2)。请留意,必须在UPDATE 子句以后最少指定一个表
接下来,指定你要利用的连接典范,即 INNER JOIN 或 LEFT JOIN 以及连接谓词。 JOIN子句必须出现在 UPDATE 子句以后(这个大家都是晓得的哈)
然后,将新值分派给要更新的 T1或 T2 表中的列
末端,在 WHERE 子句中指定一个条件以将行限制为要更新的行
假如你遵照 update 语法,你会发现有此外一种语法也可以完成跨表更新
  1. UPDATE T1, T2SET T1.c2 = T2.c2,      T2.c3 = exprWHERE T1.c1 = T2.c1 AND condition
复制代码
上面的语法实在隐式利用了 inner join 关键字,完全同即是下面的样子:
  1. UPDATE T1,T2INNER JOIN T2 ON T1.C1 = T2.C1SET T1.C2 = T2.C2,      T2.C3 = exprWHERE condition
复制代码
Update Join 例子

年末了,又到了评绩效的时候了,听说要按照 KPI 调人为了。有两张表
第一张表「employees-员工表」
我的关键词 跨表更新,Mysql Update Join  热门消息 1203146-20200215104216518-2118907180

第二张表「merits-绩效字典表」
我的关键词 跨表更新,Mysql Update Join  热门消息 1203146-20200215104216756-899054298

数据以下
我的关键词 跨表更新,Mysql Update Join  热门消息 1203146-20200215104216976-1022670029

调薪法则:原有薪资 + (原有薪资 * 当前绩效对应的调薪百分比)
依照调薪法则写 update 语句:
  1. UPDATE employees    INNER JOIN    merits ON employees.performance = merits.performanceSET salary = salary + salary * percentage;
复制代码
临近年末,公司又来了两位新同事, 可是公司年度绩效已经评完,所以新员工绩效为 NULL
  1. INSERT INTO employees(employee_name, performance, salary)VALUES ('馮大', NULL, 8000),       ('馮二', NULL, 5000);
复制代码
新员工工作干的不错,也要 1.5% 涨点人为的。假如我们照旧用 UPDATE INNER JOIN,依照上面的更新语句是不成能完成的,由于条件等式不建立,这是我们就要用到 UPDATE LEFT JOIN 了
  1. UPDATE employees    LEFT JOIN    merits ON employees.performance = merits.performanceSET salary = salary + salary * 0.015WHERE merits.percentage IS NULL;
复制代码
到这里,新员工的涨薪工作也做完
转自:https://dayarch.top/p/mysql-cross-table-update.html

免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 WAYSFOCUS 影像 你 我 他,中国商业影视一站式解决平台 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表