将一些列向后或向前移动一些列

时间:2015-02-14 19:05:52

标签: sql sql-server

我有一张大约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 

有什么想法吗?

3 个答案:

答案 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;