1

巨大なストアド プロシージャがあり、それを最適化しようとしています。

Idを持つ一時テーブルAがあります。

列IDとブールフィールドTestを持つメインテーブルBがあります

Table A のすべての Id について、Table B で Test = 1 にする必要があります。

例:

Id
--
1
2
3

次のようにテーブルBを取得する必要があります。私はすでにテーブル B に Id フィールドを持っています。テスト列 Bを更新するだけです。

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

現在、while ループを使用してテーブルAをループ処理しており、ID ごとにテーブル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

私があなたの質問を正しく理解していれば、あなたがする必要があるのは、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 に答える