如何通过单个存储过程将结尾为'/1'的佣金记录关联至同编号的其他子佣金记录?
单个存储过程实现佣金批量关联方案
当然可以通过单个存储过程搞定这个批量关联需求!下面我结合你的场景,给出具体实现思路和可参考的代码示例:
核心实现思路
- 定位父记录:筛选出
commission_number以/1结尾的佣金记录,提取它们的编号前缀(比如从222/2021/1中提取222/2021)。 - 匹配子记录:找到所有佣金编号前缀与父记录一致、且结尾数字大于1的佣金记录。
- 批量写入关联关系:将父记录与匹配到的子记录的关联关系批量插入到佣金关联表中,同时避免重复插入已存在的关联数据。
存储过程示例(以MySQL为例)
假设你的两张表结构如下:
- 佣金表:
commission(字段:id(主键)、commission_number(佣金编号)及其他业务字段) - 佣金关联关系表:
commission_relation(字段:parent_id(父佣金ID)、child_id(子佣金ID)及其他字段)
DELIMITER // CREATE PROCEDURE BatchLinkParentChildCommissions() BEGIN -- 批量插入关联关系,跳过已存在的记录 INSERT INTO commission_relation (parent_id, child_id) SELECT p.id AS parent_id, c.id AS child_id FROM commission p -- 筛选父记录:佣金编号以/1结尾 WHERE p.commission_number LIKE '%/1' -- 关联子记录:前缀相同,且结尾不是1 JOIN commission c ON SUBSTRING_INDEX(p.commission_number, '/', 2) = SUBSTRING_INDEX(c.commission_number, '/', 2) AND c.commission_number NOT LIKE '%/1' -- 跳过已存在的关联,避免重复插入 WHERE NOT EXISTS ( SELECT 1 FROM commission_relation cr WHERE cr.parent_id = p.id AND cr.child_id = c.id ); -- 可选:返回执行结果统计 SELECT CONCAT('成功完成 ', ROW_COUNT(), ' 组佣金关联') AS execution_result; END // DELIMITER ;
关键逻辑说明
- 前缀提取:用
SUBSTRING_INDEX(commission_number, '/', 2)截取佣金编号的前两段,确保父、子记录属于同一编号组。 - 子记录过滤:通过
c.commission_number NOT LIKE '%/1'排除父记录本身,只匹配结尾数字大于1的子记录。 - 去重处理:
NOT EXISTS子句避免重复插入已存在的关联关系,防止主键冲突或冗余数据。
使用方式
直接调用存储过程即可完成批量关联:
CALL BatchLinkParentChildCommissions();
如果你使用SQL Server等其他数据库,只需调整字符串处理函数(比如用LEFT+CHARINDEX替代SUBSTRING_INDEX)和存储过程语法,核心逻辑完全通用。
内容的提问来源于stack exchange,提问作者yReVo-
相关产品推荐
相关产品推荐

