1

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

我有一个临时表A,列Id

我有一个主表 B,其中包含Id列和一个布尔字段Test

对于表 A 中的所有 Id,我需要使表 B 中的 Test = 1。

例子: 一个

Id
--
1
2
3

我需要按如下方式获取表 B。我已经在表 B 中有 Id 字段,我只需要更新测试列 B

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

我目前正在使用 while 循环遍历 Table A,并且对于每个 Id 我正在更新 Table B中的 Test 列。

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 是存储过程的输入参数。

我想不出任何其他有效的方法,但是我的查询需要很长时间才能运行。如果有更好的方法来做同样的事情,请告诉我。

4

5 回答 5

2

这很简单。

UPDATE [B] 
    SET [TEST] = 1 
FROM [B] INNER JOIN [A]
    ON [A].ID = [B].ID
于 2013-04-01T20:21:45.587 回答
2

另一种选择:

UPDATE b SET test = 1
  FROM dbo.TableB AS b
  WHERE EXISTS (SELECT 1 FROM dbo.TableA WHERE ID = b.ID);
于 2013-04-01T20:22:38.937 回答
1

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

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

这是一个带有现场演示的 sqlfiddle 。

于 2013-04-01T20:20:43.323 回答
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
于 2013-04-01T20:23:09.580 回答
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

于 2013-04-01T20:27:30.910 回答