SQL Server:如何合并两条更新语句并按新值更新列C
解决方案
当然可以把两条更新语句合并成一条,关键是要避开SQL UPDATE语句的特性——SET子句里的列引用都是基于行更新前的原始值,所以直接写C = A+B会用到旧的A值。下面是两种可行的写法:
方法1:直接复用A的计算逻辑
既然A的新值是@one * B,计算C时直接用这个表达式代替A即可,结果和两条语句完全一致:
declare @one int = (select col1 from T2) update T1 set A = @one * B, C = (@one * B) + B
方法2:用CTE预计算更新值(适合复杂场景)
如果A的计算逻辑复杂,不想重复写表达式,可以先用CTE预先算出所有要更新的值,再关联表进行更新(需要T1有主键或唯一键来匹配行,比如假设主键是ID):
declare @one int = (select col1 from T2) with UpdateData as ( select ID, @one * B as NewA, (@one * B) + B as NewC from T1 ) update T1 set A = ud.NewA, C = ud.NewC from T1 t inner join UpdateData ud on t.ID = ud.ID
补充说明
SQL的UPDATE语句中,SET子句的所有赋值操作是基于同一行的原始数据计算的,不会实时引用刚更新的列值。所以必须通过复用表达式或者预计算的方式,才能让C使用A的新值来计算。
内容的提问来源于stack exchange,提问作者Hasan Shouman
相关产品推荐
相关产品推荐

