2013-04-01 96 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

相关问题