将数据从备份表列复制到原始表列

时间:2014-02-14 09:20:04

标签: sql sql-server

我意外更新了table2数据列custno的所有记录value ='33'

现在,我需要将custno的所有列数据从table1恢复到table2(不影响其他数据)。

注意,其中任何一个表都没有主键。似乎有几个ID正在重复。 table1可能会多次ID ID,并且所有table2都必须使用与ID中相同的id col1 col2 col3 col4 colN custno 1 1 dhruv joshi 3 2 12 1 1 alpha beta 3 2 12 1 1 ebta alpha 3 2 12 1 1 dhruv joshi 3 2 11 1 1 alpha beta 3 2 11 1 1 ebta alpha 3 2 10 相同的日期值填充id col1 col2 col3 col4 colN custno 1 1 dhruv joshi 3 2 33 1 1 alpha beta 3 2 33 1 1 ebta alpha 3 2 33 1 1 dhruv joshi 3 2 33 1 1 alpha beta 3 2 33 1 1 ebta alpha 3 2 33 }。

非常感谢任何帮助。

  

-------------------所以这里是更新的实际场景:-------------------- -----

表1(上表处于良好状态)

custno

表2(意外更新所有记录的custno = 33)

table1

现在我必须将此表格2列(UPDATE t2 SET t2.custno = t1.custno FROM table1 AS t1 JOIN table2 AS t2 ON t1.ID = t2.ID AND t1.col1 =t2.col1 AND t1.col2 =t2.col2 AND t1.col3 =t2.col3 AND t1.colN =t2.colN )完全恢复为id col1 col2 col3 col4 colN custno 1 1 dhruv joshi 3 2 12 1 1 alpha beta 3 2 12 1 1 ebta alpha 3 2 12 1 1 dhruv joshi 3 2 12 1 1 alpha beta 3 2 12 1 1 ebta alpha 3 2 12 而不触及任何其他列。

我希望现在能清除这种情况。

更新此查询后,会产生意外结果。

{{1}}

出乎意料的结果是

{{1}}

2 个答案:

答案 0 :(得分:1)

如果表中没有任何唯一列,则必须在(表的)多个列上应用条件,以便使行唯一可识别以进行更新。

示例,如果您的表定义为table1[ id int, col1 int, col2 varchar(100), col3 varchar(100), col4 int,..., colN int, customerNo int)并且没有唯一列。

然后根据customerNo更新它只会造成问题。

方法是识别多个(或所有)列,使其在更新期间更加独特。

UPDATE t2
SET t2.custno = t1.custno
FROM table1 AS t1
JOIN table2 AS t2
ON t1.ID = t2.ID 
AND t1.col1 =t2.col1 
AND t1.col2 =t2.col2 
AND t1.col3 =t2.col3 
..
AND t1.colN =t2.colN  

小提琴链接http://sqlfiddle.com/#!6/ff9895/2 PS:这本来是一个问题评论,但因为它太大了,我把它作为答案

我也想知道你是否有一个桌子后面为什么不简单地将它恢复到原始表格中

-- This deletes all rows
DELETE FROM table2 WHERE Id  IS NOT NULL

-- This inserts all rows from table1(the original table) into table2 to make it like table1
INSERT INTO Table2
SELECT * FROM Table1

答案 1 :(得分:0)

我不太了解但是如果表格结构相同,你可以试试这个: -

Update t2 set t2.custno = t1.custno
from
(
select ROW_NUMBER() over (order by col1 asc)as RANK, * from table_1
)t1
Inner join
(
select ROW_NUMBER() over (order by col1 asc)as RANK, * from table_2
)t2
on t1.RANK = t2.RANK