基于表A的列更新表B的列

时间:2013-04-01 20:18:37

标签: sql sql-server sql-server-2008 tsql

我有一个庞大的存储过程,我正在尝试优化它。

我有一个临时表 A ,列 ID

我有一个主表B,列 Id &布尔字段测试

对于表A中的所有Id,我需要在表B中进行Test = 1.

示例: 的 A

Id
--
1
2
3

我需要按如下方式获得表B. 我已经在表B中有Id字段,我只需要更新 测试栏     的

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

我目前正使用while循环和每个Id循环遍历Table A 我正在更新表 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是存储过程的输入参数。

我想不出任何其他有效的方法,但是 我的查询花了很多时间来运行.. 如果有更好的方法可以做同样的事情,请告诉我。

5 个答案:

答案 0 :(得分:2)

这很简单。

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

答案 1 :(得分:2)

另一种选择:

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

答案 2 :(得分:1)

您不需要为此循环,只需加入这些表

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

Here is an sqlfiddle现场演示。

答案 3 :(得分: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

答案 4 :(得分:1)

如果我正确理解你的问题,你需要做的就是加入A和B.

UPDATE TableB SET test = 1
FROM TableB b
INNER JOIN TableA a ON a.id = b.id
WHERE b.ID > @Id1

基本上,您希望更新TableA和TableB相交的所有位置。

http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html