一時テーブルの使い所は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の方が優れていますのでぜひ比べてみてください。
Amazon.co.jp