SQL如何按合同号分组将role=27行的beginn值复制到同组role=14行
问题原因
你原来的写法缺少contract字段的关联匹配,导致无法按合同号分组对应数值,会出现所有role=14的行都取到同一个值甚至执行报错的问题。
正确SQL实现
通用关联更新写法(适用于PostgreSQL、SQL Server、MySQL 8.0+)
UPDATE MyTable t1 SET beginn = t2.beginn FROM MyTable t2 WHERE t1.contract = t2.contract AND t1.role = 14 AND t2.role = 27;
老版本MySQL适配写法
UPDATE MyTable t1 JOIN MyTable t2 ON t1.contract = t2.contract AND t2.role = 27 SET t1.beginn = t2.beginn WHERE t1.role = 14;
逻辑说明
- 用同表自连接,通过
contract字段关联两个角色的行,天然实现按合同号分组匹配的需求,不需要额外写GROUP BY - 只有同合同号下同时存在role=27和role=14的行时,才会触发更新,完全符合你的业务要求
特殊场景兼容:如果同一合同号下存在多个role=27的行,可以先对role=27的数据集按contract聚合后再关联,示例:
UPDATE MyTable t1 SET beginn = t2.beginn FROM ( SELECT contract, MAX(beginn) AS beginn FROM MyTable WHERE role=27 GROUP BY contract ) t2 WHERE t1.contract = t2.contract AND t1.role = 14;
内容的提问来源于stack exchange,提问作者Herr Derb
相关产品推荐
相关产品推荐

