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版
日米のDBの達人、夢の共演! SQLの第一人者であるジョー・セルコの名著『Joe Celko's SQL for Smarties, Fourth Edition: Advanced SQL Programming』の日本語版です。本書は、SQLの実務経験があるエンジニアを対象として、SQLプログラミングの基礎的な考え...
SQL
AD
味方出版