如何以递归方式更新SQL Server中的组

时间:2010-01-11 09:01:55

标签: sql sql-server tsql

我正在使用sql Server 2008。

关注dataPool:

PK  Col1        Col2
1   SomeValue1  DataToTake1
2   SomeValue1
3   SomeValue1
4   SomeValue1
5   SomeValue2  DataToTake2
6   SomeValue2
...

我想将DataToTake1插入Col2条记录PK中,DataToTake2 2,3和4以及Col2加入PK记录PK }。
使其更加明显:Col1 1-4的记录是组,由PK指示 另一个信息:Col1可能不是生产系统上的增量或排序(但我们可以按PK Col1 Col2 1 SomeValue1 DataToTake1 2 SomeValue1 4 SomeValue1 5 SomeValue2 DataToTake2 6 SomeValue2 9 SomeValue1 分组,我希望这可能不是问题。)

有什么方法可以使用sql Server吗? (一个伴侣用指针实现了这个...... arggggh)

修改
谢谢你的答案,但我必须修改我的要求,因为我的初始情况发生了变化:我需要考虑PK。例如

{{1}}

如何只更新有序行?在这个例子中,PK 1 = 2 = 4

3 个答案:

答案 0 :(得分:2)

UPDATE
   D1
SET
   Col2 = D2.Col1
FROM
   dataPool D1
   JOIN
   dataPool D2 ON D1.col1 = D2.col1
WHERE
   D1.col2 <> D2.col2 OR D1.col2 IS NULL

答案 1 :(得分:1)

-- Select the top 1 value which has data, and matches whats in Col1
UPDATE dataPool
SET Col2 = (SELECT TOP 1 t3.Col2 
            FROM dataPool t3 
            WHERE t3.col1 = t2.col1 
            AND t3.Col2 IS NOT NULL) -- 
FROM dataPool t2
WHERE t2.Col1 = Col1
AND col2 IS NULL -- Only update Rows with NULLs in

答案 2 :(得分:1)

我认为你必须使用临时表:

创建表#DataToTake(   seq int not null identity(1,1),   PK_S int not null, - 将此值设置为与dataPool中的PK相同的类型   PK_E int null, - 将此值设置为与dataPool中的PK相同的类型   Col1 varchar(20)null, - 将此值设置为与dataPool中的Col1相同的类型   Col2 varchar(20)null - 将此值设置为与dataPool中的Col2相同的类型 )

插入#DataToTake (PK_S,Col1,Col2) 选择PK,Col1,Col2 来自dataPool 其中Col2不为空 按PK命令

更新#DataToTake设置   PK_E = dtt2.PK_S 从#DataToTake内部联接#DataToTake dtt2开启   #DataToTake.seq = dtt2.seq - 1

更新#DataToTake设置   PK_E =(从dataPool中选择Max(PK)+ 1) 其中PK_S =(从#DataToTake中选择Max(PK_S))

更新dataPool集   Col2 = dtt.Col2 来自dataPool内部连接#DataToTake dtt on   dataPool.PK&gt; dtt.PK_S   和dataPool.PK&lt; dtt.PK_E   和dataPool.Col1 = dtt.Col1

drop table #DataToTake