概要
普段から業務で動かしているSQL を改修する話があった。
下記のSQL はイメージ
SELECT A.test1 ,C.test1 ,C.test3 FROM A INNER JOIN B ON A.test3 = B.test3 AND INNER JOIN C ON A.test4 = C.test4 AND A.test5 = B.test5
上記のSQL で改修する上で
「INNER JOIN で接続している部分をEXISTS に変更して欲しい」
と指示された。
これを機にINNER JOIN とEXISTS の使い分け方について調べてみた。
結論
上記の記事によると
他のテーブルのカラムを出力する場合には JOIN
他のテーブルで検索条件に使いた場合には EXISTS
とのこと。
概要で書かれているSQL でテーブルB は
SELECT で出力するカラムがない
テーブルB はあくまで条件があるかどうか確認するために連結している
上記の理由によりテーブルBの部分をEXISTS に変更した方がメモリや処理時間を小さくすることができるということだった。
下記は書き換えたイメージ。
SELECT A.test1 ,C.test1 ,C.test3 FROM A, C WHERE EXISTS ( SELECT 1 FROM B WHERE A.test3 = B.test3 AND A.test5 = B.test5 )