2017-09-01 3 views
0

IDの大きなリストを持っていて、リストにIDを含まない行を削除する必要がある場合、ベストプラクティスはどうなるのだろうかと思っていました。IDが(非常に大きい)リストにない行を削除する - ベストプラクティスですか?

DELETE FROM Foo 
WHERE ID NOT IN (1, 2, 3,... 20000) 

をしかし、私はこのソリューションは、あなたのリストはかなり大きい場合、どのようにパフォーマンスの対応はよく分からない:

それは機能「ではないで」を使用している移動するための方法のように私には思えます。

それ以外の方法はありますか?

+1

は一時テーブル –

+0

を記入..and存在ではないでしょうか? – Amit

+0

詳しいことはできますか? – mp1990

答えて

3

作成および記入一時テーブルを、次にNOT INNOT EXISTSまたはLEFT OUTER JOINを使用することができます。

CREATE TABLE #foo(id INT) 

INSERT #foo VALUES(1) 
INSERT #foo VALUES(2) 
INSERT #foo VALUES(3) 
INSERT #foo VALUES(4) 
INSERT #foo VALUES(5) 
INSERT #foo VALUES(6) 
INSERT #foo VALUES(20000) 

WHILE @@rowcount > 0 
BEGIN 
    DELETE TOP (100) FROM Foo WHERE NOT EXISTS (SELECT 1 FROM #foo f WHERE f.Id = Foo.ID) 
END 

関連:How would I create a temp table in SQL Server when I have a big list of ID's

+0

なぜwhileループですか? – Amit

+0

@Amit:不要、バッチがテーブルのサイズが大きい場合に削除する方法 –

+1

tempテーブルに主キーがあることを確認してください。 –

関連する問題