SQL 一時テーブル #tmp_table と Exists

 一時テーブルの使い所はWITHと迷うところもありますが、INの中身を一時テーブルに置換えた使い方を提案します。

INの場合

select *
from table1
where ID IN(1,2,3,4,5)

union all

select *
from table
2
where ID IN(1,2,3,4,5);

一時テーブルとEXISTSの場合

CREATE TABLE #tmp (ID int NOT NULL)
ALTER TABLE #tmp ADD PRIMARY KEY CLUSTERED (ID ASC)
INSERT INTO #tmp VALUES(1),(2),(3),(4),(5);

select *
from table1
where exists (select ID from #tmp Where #tmp.ID = table1.ID)

union all

select *
from table2
where exists (select ID from #tmp Where #tmp.ID = table2.ID)
;

--セッション切断で削除されるが、一時テーブル削除を明示
IF OBJECT_ID(N'tempdb..#tmp', N'U') IS NOT NULL
DROP TABLE #tmp;

 もしもINの中身が増えたりメンテナンスが必要なものだとしたら。INを使う場所が10箇所だったら。その場合は一時テーブルとEXISTSが役に立つはずです。
 INは中身がわかっていて明示して指定するものと考えると、EXISTSに定形のテーブルを入れることは違和感を感じる方もいるかもしれません。本来であればEXISTSの中にはWHEREを伴うテーブルを入れることが常用されている印象があります。パフォーマンスではEXISTSの方が優れていますのでぜひ比べてみてください。

プログラマのためのSQL 第4版 | ジョー・セルコ, Joe Celko, ミック, ミック |本 | 通販 | Amazon
Amazonでジョー・セルコ, Joe Celko, ミック, ミックのプログラマのためのSQL 第4版。アマゾンならポイント還元本が多数。ジョー・セルコ, Joe Celko, ミック, ミック作品ほか、お急ぎ便対象商品は当日お届けも可能。またプログラマのためのSQL 第4版もアマゾン配送商品なら通常配送無料。
SQL
AD
味方出版