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

合并三条SQL更新语句为单语句,创建员工薪资更新存储过程

合并SQL更新语句并创建存储过程

合并后的单条UPDATE语句

通过预计算每个员工的奖金总额和最新奖金日期,一次性关联更新employee_1表,避免多次扫描表提升效率:

UPDATE employee_1 e
JOIN (
    SELECT 
        employee_id,
        SUM(bonus_amount) AS total_bonus,
        MAX(bonus_date) AS latest_bonus_date
    FROM bonus_1
    GROUP BY employee_id
) b ON e.employee_id = b.employee_id
SET 
    e.salary = e.old_salary + b.total_bonus,
    e.last_bonus_date = b.latest_bonus_date;

封装成存储过程

把上述语句做成存储过程,方便重复调用:

DELIMITER //

CREATE PROCEDURE UpdateEmployeeSalaryAndBonusDate()
BEGIN
    UPDATE employee_1 e
    JOIN (
        SELECT 
            employee_id,
            SUM(bonus_amount) AS total_bonus,
            MAX(bonus_date) AS latest_bonus_date
        FROM bonus_1
        GROUP BY employee_id
    ) b ON e.employee_id = b.employee_id
    SET 
        e.salary = e.old_salary + b.total_bonus,
        e.last_bonus_date = b.latest_bonus_date;
END //

DELIMITER ;

补充说明

  • 用JOIN替代原语句里的多次子查询,减少数据库重复扫描,执行效率更高
  • 直接将old_salary与总奖金相加赋值给salary,一步完成原第三条语句的薪资累加逻辑
  • 如果要处理无奖金记录的员工(避免salary或last_bonus_date被置为NULL),可以改用LEFT JOIN配合COALESCE:
    UPDATE employee_1 e
    LEFT JOIN (
        SELECT 
            employee_id,
            SUM(bonus_amount) AS total_bonus,
            MAX(bonus_date) AS latest_bonus_date
        FROM bonus_1
        GROUP BY employee_id
    ) b ON e.employee_id = b.employee_id
    SET 
        e.salary = e.old_salary + COALESCE(b.total_bonus, 0), -- 无奖金则加0,薪资保持原old_salary
        e.last_bonus_date = COALESCE(b.latest_bonus_date, e.last_bonus_date); -- 无奖金则保留原日期
    

内容的提问来源于stack exchange,提问作者4PS18IS039 SAMARTH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 09:35:22