我有一个庞大的存储过程,我正在尝试优化它。
我有一个临时表 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是存储过程的输入参数。
我想不出任何其他有效的方法,但是 我的查询花了很多时间来运行.. 如果有更好的方法可以做同样的事情,请告诉我。
答案 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