INNER JOIN と EXISTS の使い分け

概要

普段から業務で動かしている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 の使い分け方について調べてみた。

結論

shiro-secret-base.com

上記の記事によると

  • 他のテーブルのカラムを出力する場合には 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
)