SQL问题:从#Test匹配ID和DayNumber更新#BlueTable时数据被覆盖
解决临时表更新时意外覆盖原有非空值的问题
我猜你是写了不带过滤条件的UPDATE语句,导致#BlueTable里原本有值的BL_CM字段被#Test的数据给覆盖了对吧?这种情况在SQL更新关联表时很常见,尤其是没考虑到要保留原有非空数据的场景。
问题出在哪?
如果你的更新语句是类似下面这种:
UPDATE #BlueTable SET BL_CM = t.CM_Value FROM #BlueTable bt INNER JOIN #Test t ON bt.ID = t.ID AND bt.DayNumber = t.DayNumber
它会把所有ID和DayNumber匹配的行的BL_CM都替换成#Test里的值——不管原来的BL_CM是不是空值,自然就会覆盖掉之前的有效数据。
怎么改才能保留原有非空值?
只需要在UPDATE语句里加一个WHERE条件,限定只更新#BlueTable中BL_CM为空的行就行:
UPDATE #BlueTable SET BL_CM = t.CM_Value FROM #BlueTable bt INNER JOIN #Test t ON bt.ID = t.ID AND bt.DayNumber = t.DayNumber WHERE bt.BL_CM IS NULL
这样操作后,只有原本BL_CM为空的匹配行会被#Test的数据填充,已经有值的行会原封不动保留下来。
额外排查点
如果改完还是不符合预期,你可以检查下:
- #Test表中是否存在同一个ID+DayNumber对应多行数据的情况?这种时候更新可能会随机取一行的值,建议用聚合函数(比如
MAX(t.CM_Value))或者TOP 1来明确取值逻辑 - 确认ID和DayNumber的匹配条件是否完全正确,有没有漏判或者错判的情况
最后再跑你的验证查询:
select * from #BlueTable where BL_CM is not null order by ID
应该就能得到既有原有非空值、又有新填充数据的预期结果了。
内容的提问来源于stack exchange,提问作者Sleepyfalcon
相关产品推荐
相关产品推荐

