这可能是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
我认为这可以通过光标轻松完成,但必须有更好的方法。
答案 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