如何将具有NULL值的所有记录更新为下一个现有值

时间:2013-10-14 21:38:45

标签: sql sql-server-2008

这可能是SQL 101,但它让我感到难过。

我有这样的数据:

ID     ZipCode     Value
1      12345       1
2      12346       Null
3      12347       Null
4      12348       2
5      12349       3
6      12350       Null
7      12351       Null
8      12352       4

我需要一种方法来更新具有空值''的记录更新为NEXT可用值。

即:

ID     ZipCode     Value
1      12345       1
2      12346       2
3      12347       2
4      12348       2
5      12349       3
6      12350       4
7      12351       4
8      12352       4

我认为这可以通过光标轻松完成,但必须有更好的方法。

2 个答案:

答案 0 :(得分:2)

无需使用光标。 在单个语句中更新表可能很棘手。

为了安全起见,我首先会得到结果集,其中包含要为所有NULL值指定的值:

WITH B AS
(
SELECT ID, (SELECT MIN(Value) 
            FROM MyTable 
            WHERE ID > A.ID AND MyTable.Value IS NOT NULL) ValueToAssign
FROM MyTable A
WHERE Value IS NULL
)


UPDATE MyTable
SET Value = B.ValueToAssign
FROM MyTable JOIN B ON MyTable.ID = B.ID

答案 1 :(得分:0)

如果ID之间存在间隙,则可以正常工作。

这是SqlFiddle上的演示。

;with cte
as
(
select ID, ZipCode, Value, ROW_NUMBER() OVER(ORDER BY ID) rn
from tb o
)
, ct
as
(
select top 1 * 
from cte  
order by rn desc

union all

select t.ID, t.ZipCode, 
case when t.Value is null then o.Value else t.Value end 'Value', t.rn
from cte t inner join ct o on t.rn = o.rn - 1
)

update tb
set Value = ct.Value
from tb inner join ct on tb.ID = ct.ID
where tb.Value is null