如何用SQL在同一张表中按不同条件更新两个字段?
没问题,这就给你对应的UPDATE语句和实现思路,完全贴合你的需求:
核心UPDATE语句
直接用CASE WHEN来实现字段的条件更新,一条语句就能搞定两个字段的更新:
UPDATE TableA SET QtyToGenerate1 = CASE WHEN QtyToGenerate1 = 0 THEN QtyOrdered ELSE QtyOrdered - QtyGenerated1 END, QtyToGenerate2 = CASE WHEN QtyToGenerate2 = 0 THEN QtyOrdered ELSE QtyOrdered - QtyGenerated2 END;
实现思路说明
- 对于
QtyToGenerate1:用CASE判断当前值是否为0,如果是就直接赋值为QtyOrdered;否则计算QtyOrdered - QtyGenerated1作为新值 - 对于
QtyToGenerate2:逻辑和第一个字段完全一致,只是对应了各自的关联字段(QtyGenerated2) - 这条语句会批量处理表中所有符合逻辑的行,不需要拆分多次UPDATE,效率更高
注意事项
- 测试先行:建议先执行
SELECT语句验证逻辑是否正确,避免直接更新出错:SELECT QtyToGenerate1, CASE WHEN QtyToGenerate1 = 0 THEN QtyOrdered ELSE QtyOrdered - QtyGenerated1 END AS New_QtyToGenerate1, QtyToGenerate2, CASE WHEN QtyToGenerate2 = 0 THEN QtyOrdered ELSE QtyOrdered - QtyGenerated2 END AS New_QtyToGenerate2 FROM TableA; - 事务保护:如果是生产环境,建议把UPDATE放在事务中,避免中途出错导致数据不一致:
BEGIN TRANSACTION; -- 执行上面的UPDATE语句 -- 验证数据正确后提交 COMMIT TRANSACTION; -- 出错则回滚 -- ROLLBACK TRANSACTION; - 性能优化:如果表数据量很大,可以添加WHERE条件过滤需要更新的行(比如只更新
QtyToGenerate1或QtyToGenerate2不为NULL的行),避免全表扫描浪费资源
内容的提问来源于stack exchange,提问作者user9531726
相关产品推荐
相关产品推荐

