我正在使用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
答案 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