You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 11:54:01