如何用MySQL UPDATE语句从另一表更新职位所需技能总数?
解决方法:用UPDATE关联统计结果更新tskill列
这个需求其实很常见,核心就是先统计每个职位对应的技能总数,再把数值回填到POSITIONS表的tskill字段里。下面分几种常见数据库的写法给你参考:
1. MySQL/SQL Server 等支持UPDATE JOIN的数据库
最直观的写法是先通过子查询统计每个pnum的技能数量,再和POSITIONS表关联更新:
UPDATE POSITIONS p JOIN ( -- 子查询:按pnum分组统计技能数量 SELECT pnum, COUNT(*) AS skill_count FROM SNEEDED GROUP BY pnum ) s ON p.pnum = s.pnum SET p.tskill = s.skill_count;
执行这条语句后,示例数据里的结果会是:
- pnum 001的tskill变为2(对应cooking和cleaning两个技能)
- pnum 002的tskill变为1(对应teaching)
- pnum 003的tskill变为1(对应driving)
如果你的业务场景中存在没有对应技能的职位(比如某个pnum在SNEEDED里没有记录),想要把这类职位的tskill设为0而不是NULL,可以改用LEFT JOIN配合COALESCE函数:
UPDATE POSITIONS p LEFT JOIN ( SELECT pnum, COUNT(*) AS skill_count FROM SNEEDED GROUP BY pnum ) s ON p.pnum = s.pnum SET p.tskill = COALESCE(s.skill_count, 0);
2. Oracle 数据库
Oracle不支持直接的UPDATE JOIN写法,我们可以用相关子查询来实现:
UPDATE POSITIONS p SET tskill = ( SELECT COUNT(*) FROM SNEEDED s WHERE s.pnum = p.pnum );
同样,如果要处理无对应技能的职位,用COALESCE把NULL转为0:
UPDATE POSITIONS p SET tskill = COALESCE( (SELECT COUNT(*) FROM SNEEDED s WHERE s.pnum = p.pnum), 0 );
验证效果
执行完上述语句后,你可以用查询语句验证结果:
SELECT * FROM POSITIONS;
示例数据的输出会是:
| pnum | ptitle | tskill |
|---|---|---|
| 001 | chef | 2 |
| 002 | teacher | 1 |
| 003 | driving instructor | 1 |
内容的提问来源于stack exchange,提问作者Tyrionus
相关产品推荐
相关产品推荐

