2014-02-14 90 views
0

我不小心更新了所有記錄table2數據列custnovalue ='33'從備份表列原始表列

現在我需要從table1恢復所有列數據爲custnotable2複製數據(不影響其他數據)。

注意在任何一個表上都沒有主鍵。它似乎也有幾個ID正在重複。 table1可能不止一次地具有相同的ID,並且所有ID都需要使用與table2中發現的日期值相同的ID來填充。

任何幫助,非常感謝。

-------------------所以這裏是更新的實際場景:----------------- --------

表1(狀態良好上表)

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 

表2(無意中更新custno = 33對於所有的記錄)

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 

現在我必須恢復此表2列(custno)與table1完全一致,不觸及任何其他列。

我希望這會清除現在的情況。

更新此查詢後,它會產生意外的結果。

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

如果你沒有在表中的任何唯一列,你必須申請上多列,以便它使(表)的條件該行可唯一標識以進行更新。

示例如果您的表被定義爲table1[ id int, col1 int, col2 varchar(100), col3 varchar(100), col4 int,..., colN int, customerNo int)並且沒有唯一的列。

然後根據客戶更新它只會造成問題。

方法是識別多個(或全部)列以使其在更新過程中更加獨特,就像這樣。

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 
+0

多部分標識符t1.custno = t2.custno無法綁定...發生此錯誤.. – user2139057

+0

唉!這是一個簡單的錯誤...更新答案,並添加一個Sqlfiddle – DhruvJoshi

+0

謝謝dhruv ..但我的情況是不同的..我意外地更新所有客戶不與價值12 ...所以我需要恢復該特定列從原始備份表 – user2139057

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