You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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;

示例数据的输出会是:

pnumptitletskill
001chef2
002teacher1
003driving instructor1

内容的提问来源于stack exchange,提问作者Tyrionus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:07:55