1

这可能是 SQL 101,但它难倒我。

我有这样的数据:

ID 邮政编码值
1 12345 1
2 12346 空
3 12347 空
4 12348 2
5 12349 3
6 12350 空
7 12351 空
8 12352 4

我需要一种方法来更新具有空“值”的记录,并将其更新为 NEXT 可用值。

IE:

ID 邮政编码值
1 12345 1
2 12346 2
3 12347 2
4 12348 2
5 12349 3
6 12350 4
7 12351 4
8 12352 4

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

4

2 回答 2

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
于 2013-10-14T21:41:15.747 回答
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
于 2013-10-14T23:25:10.587 回答