编写存储过程基于主表更新Temp表空字段并标记不匹配记录
存储过程实现方案(MySQL语法示例,其他数据库可按需调整语法)
涉及表结构说明
- 表1:
department_master(部门主表,原需求拼写为deparmant_master为笔误,使用时请和实际表名对齐),字段包括Department_id(部门ID)、department name(部门名称) - 表2:
Cadre_master(干部主表),字段包括Cadre_id(干部ID)、cadre_name(干部姓名)、Department_id(所属部门ID) - 表3:
Post_master(岗位主表),字段包括Post_id(岗位ID)、Post_name(岗位名称)、Cadre_id(所属干部ID)、Department_id(所属部门ID) - 表4:
Temp(临时待处理数据表),字段包括Department_name(部门名称)、Department_id(部门ID)、Post_id(岗位ID)、Cadre_id(干部ID)、Cadre_name(干部姓名)、Remarks(备注,用于标记异常)
实现逻辑
- 更新
Temp表缺失的部门ID:仅当Temp.Department_id为空、Temp.Department_name不为空时,关联部门主表按部门名称匹配更新 - 更新
Temp表缺失的干部ID:仅当Temp.Cadre_id为空、Temp.Cadre_name不为空且Temp.Department_id有有效值时,关联干部主表按干部姓名+所属部门ID匹配更新 - 更新
Temp表缺失的岗位ID:仅当Temp.Post_id为空、Temp.Cadre_id和Temp.Department_id均有有效值时,关联岗位主表按干部ID+部门ID匹配更新 - 异常标记:所有部门ID/干部ID/岗位ID仍为空的记录,统一将
Remarks字段更新为Unmatched/False
存储过程代码
DELIMITER // CREATE PROCEDURE UpdateTempDataAndMarkException() BEGIN -- 更新缺失的部门ID UPDATE Temp t LEFT JOIN department_master dm ON t.Department_name = dm.`department name` SET t.Department_id = dm.Department_id WHERE t.Department_id IS NULL AND t.Department_name IS NOT NULL; -- 更新缺失的干部ID UPDATE Temp t LEFT JOIN Cadre_master cm ON t.Cadre_name = cm.cadre_name AND t.Department_id = cm.Department_id SET t.Cadre_id = cm.Cadre_id WHERE t.Cadre_id IS NULL AND t.Cadre_name IS NOT NULL AND t.Department_id IS NOT NULL; -- 更新缺失的岗位ID UPDATE Temp t LEFT JOIN Post_master pm ON t.Cadre_id = pm.Cadre_id AND t.Department_id = pm.Department_id SET t.Post_id = pm.Post_id WHERE t.Post_id IS NULL AND t.Cadre_id IS NOT NULL AND t.Department_id IS NOT NULL; -- 标记未匹配成功的异常记录 UPDATE Temp SET Remarks = 'Unmatched/False' WHERE Department_id IS NULL OR Cadre_id IS NULL OR Post_id IS NULL; END // DELIMITER ;
调用方法
执行CALL UpdateTempDataAndMarkException();即可完成全量数据处理。
提示:如果使用Oracle、SQL Server等其他数据库,仅需调整UPDATE关联语法和存储过程定义语法即可,核心处理逻辑无需改动。
内容的提问来源于stack exchange,提问作者Rahul T R
相关产品推荐
相关产品推荐

