Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何将具有空值的所有记录更新为下一个现有值_Sql_Sql Server 2008 - Fatal编程技术网

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

Sql 如何将具有空值的所有记录更新为下一个现有值,sql,sql-server-2008,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 ID ZipCode值 1

这可能是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 ID ZipCode值 1 12345 1 212346无效 312347无效 4 12348 2 5 12349 3 6 12350空 7 12351无效 8 12352 4 我需要一种方法来更新具有空“值”的记录,并将其更新为下一个可用值

即:

ID ZipCode值 1 12345 1 2 12346 2 3 12347 2 4 12348 2 5 12349 3 6 12350 4 7 12351 4 8 12352 4
我认为使用光标可以很容易地做到这一点,但必须有更好的方法。

没有必要使用光标。 在单个语句中更新表可能很棘手

因此,为了安全起见,我首先会得到一个结果集,其中包含为所有
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

如果ID之间存在间隙,则该方法有效

这里有一个演示


询问代码的问题必须证明对正在解决的问题的最低理解。包括尝试的解决方案,以及它们不起作用的原因。我在google上找到了一些关于“sql查找缺少的日期范围”的相关信息……还请指定sql方言,最好还包括相关的标记。这会更新空记录,但会将它们全部更新为最高的可用“值”(4),不是下一个可用值。我正在使用MS SQL Server 2008。不R2@GregBaker-看我的编辑。太好了!正是我想要的。我将对您的代码进行一些认真的分析。
Value
列中的值的升序与
ID
值的升序相同。@ypercube-您必须假设一些顺序,这是OP提供的顺序。。
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
;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