如何将SQL Server中带JOIN的可用SELECT查询改写为UPDATE更新语句
SQL Server 正确更新写法
写法1:CTE关联更新(性能最优,适合大数据量场景)
你原有查询中的CASE判断为冗余逻辑,因为JOIN条件已经限定了时间范围,可以直接简化后封装为CTE关联更新:
WITH DurSumCalculation AS ( SELECT ktf.ourfile, SUM(kt.duration) AS TotDur FROM tblktime kt INNER JOIN tblktimefst ktf ON ktf.ourfile = kt.ourfile AND kt.btime <= ktf.fstLSFBtime GROUP BY ktf.ourfile ) UPDATE target SET target.fstLSFDurSum = calc.TotDur FROM tblktimefst target INNER JOIN DurSumCalculation calc ON target.ourfile = calc.ourfile
写法2:子查询直接更新(逻辑更直观,适合全量覆盖场景)
如果需要将tblktime中没有匹配记录的ourfile对应的fstLSFDurSum统一设为0,可以使用该写法:
UPDATE target SET target.fstLSFDurSum = ISNULL( ( SELECT SUM(kt.duration) FROM tblktime kt WHERE kt.ourfile = target.ourfile AND kt.btime <= target.fstLSFBtime ), 0 ) FROM tblktimefst target
前置校验建议
更新前可先执行以下查询校验更新值是否符合预期,避免误操作:
SELECT target.ourfile, target.fstLSFDurSum AS 原字段值, ISNULL( (SELECT SUM(kt.duration) FROM tblktime kt WHERE kt.ourfile = target.ourfile AND kt.btime <= target.fstLSFBtime), 0 ) AS 待更新值 FROM tblktimefst target
内容的提问来源于stack exchange,提问作者JonL
相关产品推荐
相关产品推荐

