2013-04-01 58 views
1

我有一個巨大的存儲過程,我試圖優化它。基於表A列的表B的更新列

我有一個臨時表一個,與列ID

我有一個列的主表B中標識 &一個布爾字段測試

對於所有標識的表A,我需要測試= 1表B.

例子: 一個

Id 
-- 
1 
2 
3 

我需要得到B表如下。 我已經在表B中的ID字段中,我只需要更新 檢測柱

Id Test 
-- ---- 
1 1 
2 1 
3 1 
4 
5 
6 

我目前通過表一個使用while循環循環併爲每個ID 我正在更新表B中的測試列。

WHILE (1 = 1) 
BEGIN 

    -- Exit loop if no more Transactions 
    IF @@ROWCOUNT = 0 BREAK; 

    Update [B] 
    set Test = 1 
    where Id = (SELECT TOP 1 Id 
    FROM #B 
    WHERE Id > @Id1 
    ORDER BY Id)  

END 

PS:@ Id1是存儲過程的輸入參數。

我想不出有任何其他有效的方法,但 我的查詢花了很多時間來運行.. 請讓我知道是否有更好的方法來做同樣的事情。

回答

1

你並不需要循環爲此,剛剛加入這些表

UPDATE B 
SET B.Test = 1 
FROM TableB B 
INNER JOIN TableA A 
    ON A.Id = B.ID 

Here is an sqlfiddle了現場演示。

2

這很簡單。

UPDATE [B] 
    SET [TEST] = 1 
FROM [B] INNER JOIN [A] 
    ON [A].ID = [B].ID 
+0

謝謝您的解決方案! – CodeNinja

2

另一種選擇:

UPDATE b SET test = 1 
    FROM dbo.TableB AS b 
    WHERE EXISTS (SELECT 1 FROM dbo.TableA WHERE ID = b.ID); 
1

您可以使用in找到記錄更新:

update b 
set Test = 1 
where Id in (select Id from #A) 

另一種方法是加入表:

update x 
set Test = 1 
from b as x 
inner join #A as a on a.id = x.id 
+0

謝謝您的替代解決方案! – CodeNinja

相關問題