2016-05-12 91 views
1

我認爲這將通過包含幾個表更容易解釋。在SQL Server 2012中更新數百萬條記錄

表A:

UserId  StoreId 
1   10 
2   20 
3   30 
4   40 

表B:

UserId  StoreId 
1   10 
1   20 
1   20 
2   20 
2   10 
2   10 
3   30 
3   40 
3   40 
4   40 
4   30 
4   30 

我需要一個腳本,將進入表2和更新存儲匹配表A中StoreId針對特定用戶。最後,我應該看看;

表B:

UserId  StoreId 
1   10 
1   10 
1   10 
2   20 
2   20 
2   20 
3   30 
3   30 
3   30 
4   40 
4   40 
4   40 

所以我的問題是,什麼是做最簡單的方法,考慮到表B的數百萬行的百強它,和桌子的有大約20萬行?

提前致謝!

回答

5

最好的辦法是:

ALTER TABLE Table_B 
DROP COLUMN StoreId 

現在你不再存儲重複數據,你可以直接從Table_A得到StoreId當你需要它。

否則,它只是一個簡單的UPDATEJOIN

UPDATE B 
SET 
    StoreId = A.StoreID 
FROM 
    Table_B B 
INNER JOIN TABLE_A A ON A.UserId = B.UserId 

你可以把這個到,如果你爲了削減更新的大小,以便它不需要執行批次循環將您的交易日誌氾濫成災。有幾種方法可以做到這一點。舉個例子:

DECLARE 
    @batch_size INT = 10000, 
    @min_user_id INT = 1, 
    @max_user_id INT 

SELECT @max_user_id = MAX(UserId) FROM Table_A 

WHILE (@min_user_id <= @max_user_id) 
BEGIN 
    UPDATE B 
    SET 
     StoreId = A.StoreID 
    FROM 
     Table_B B 
    INNER JOIN TABLE_A A ON A.UserId = B.UserId 
    WHERE 
     B.UserId BETWEEN @min_user_id AND @min_user_id + @batch_size 

    SET @min_user_id = @min_user_id + @batch_size + 1 
END 
+1

很好的答案 – Lamak

+0

我希望我可以去和丟棄列,但我來到這個項目它創造了許多年之後。這需要對前端網站以及我們的EDMX進行一些修改,以便在此時刪除不必要的列。 雖然很好的答案!我很欣賞快速反應! – akaWizzmaster

0
select 1 
while (@@rowcount > 0) 
begin 
    UPDATE top(1000) B 
    SET b.StoreId = A.StoreID 
    FROM Table_B B 
    INNER JOIN TABLE_A A ON A.UserId = B.UserId 
    where b.StoreId <> A.StoreID 
     or b.StoreId is null 
end 
相關問題