我有一张大约8000行和15列的表格。在我插入数据之后,我看到我的数据在一些记录之后是错误的(让我们说1000)一些列值属于前一条记录,有些像这样:
A B C (A+B)
==================================
1 1 2
2 2 4
3 3 6
4 4 8
5 5
6 6 10
7 7 12
8 8 14
9 9 16
现在我必须要么将一些列值移回记录中,要么我还没有多少选项进行测试,我担心我可能会覆盖一些数据而毁掉整个表格
我应该这样做,但大约有7000条记录:
update table1
set B = (select B from table1 where id = 1000)
where id = 999
有什么想法吗?
答案 0 :(得分:2)
如果你知道id是顺序的,没有间隙,你可以使用join
来查找你想要的值:
update t1
set c = tt1.c
from table1 t1 join
table1 t2
on t1.id = t2.id - 1
where t1.id > 1000;
如果您不相信ID,则可以使用row_number()
创建适当的序号而不会出现空白:
with toupdate as (
select t.*, row_number() over (order by id) as seqnum
from table1
)
update t1
set c = tt1.c
from toupdate t1 join
toupdate t2
on t1.seqnum = t2.seqnum - 1
where t1.id > 1000;
答案 1 :(得分:0)
使用与相关表格相同的字段创建另一个表。插入不良记录。修复新表中的数据。从新的表更新真实表。
答案 2 :(得分:0)
首先,在对数据进行明确更改之前,应始终测试语句。您可以启动一个事务,只有在确定它运行良好时才提交,或者复制一个表(select * into x from y
)并对其进行测试。
要回答你的问题,请尝试这样的事情;
WITH dataToUpdate AS(
SELECT RowNr ,
DATA,
DataFromPreviousRow = FIRST_VALUE(data) OVER (ORDER BY RowNr ROWS 1 PRECEDING)
FROM dbo.test
)
UPDATE dataToUpdate
SET data = dataToUpdate.DataFromPreviousRow;