使用UPDATE和SET更新SQL Server临时表但值未变更的问题求助
解决SQL Server临时表中按分组替换0值的问题
问题分析
你的现有代码逻辑存在错误:CASE语句中,当检测到分组存在非零值时,你把Column_B设为当前行的Column_B值(也就是0,因为UPDATE的WHERE条件限定了Column_B=0),等于没有执行任何替换操作,这就是数据未发生变化的原因。
正确解决方案
这里提供两种高效的实现方式:
方法1:关联子查询获取分组非零值
通过子查询定位每个Column_A对应的非零Column_B值,直接替换0值:
UPDATE t SET Column_B = (SELECT TOP 1 Column_B FROM #temp_table t2 WHERE t2.Column_A = t.Column_A AND t2.Column_B <> 0) FROM #temp_table t WHERE t.Column_B = 0;
注:如果每个
Column_A分组内的非零值唯一(如你的示例数据),TOP 1可确保获取正确值;若分组内存在多个不同非零值,需根据业务需求改用MAX()/MIN()等聚合函数。
方法2:窗口函数实现(SQL Server 2012+适用)
利用MAX()窗口函数计算每个分组的非零值,再批量更新:
WITH CTE AS ( SELECT Column_A, Column_B, MAX(Column_B) OVER (PARTITION BY Column_A) AS GroupNonZeroValue FROM #temp_table ) UPDATE CTE SET Column_B = GroupNonZeroValue WHERE Column_B = 0;
这种方式更简洁,MAX()会自动忽略0值,直接取分组内的有效非零值。
验证结果
执行上述任意一种方法后,临时表数据将符合预期:
| Column_A | Column_B |
|---|---|
| ABC | 123 |
| ABC | 123 |
| ABC | 123 |
| DEF | 456 |
| DEF | 456 |
| DEF | 456 |
| GHI | 123 |
| GHI | 123 |
内容的提问来源于stack exchange,提问作者GLo
相关产品推荐
相关产品推荐

