IF
プレフィックスを取り除き、IN()
そのEXISTS()
ように作業する場合。
まず、使用するバージョンIN()
は一般的に悪い考えです。パフォーマンスの観点からは、WHERE 句でサブクエリを使用するよりも、JOIN または派生テーブルを使用する方がはるかに優れています。
-- instead of:
SELECT * FROM tbl1 WHERE tbl1.v_short IN (SELECT tbl2.sname FROM tbl2)
-- you would want something like:
SELECT tbl1.* FROM tbl1 JOIN tbl2 ON (tbl2.sname = tbl1.v_short)
EXISTS()
一方、非常に便利です。これは、INNER JOIN と同一になるように最適化されていますNOT EXISTS()
が、IS NULL チェックを使用した LEFT JOIN と同一です。この[NOT] EXISTS()
バージョンは、英語のように読みやすくなっています。EXISTS 内の SELECT に列リストを渡しても意味がないことに注意してください。これは使用されず、毎回 SELECT * として最適化されます。
-- easy to read:
SELECT * FROM tbl1 WHERE EXISTS (SELECT * FROM tbl2 WHERE tbl2.sname = tbl1.v_short)
-- same thing, just more SQL-like than English-like:
SELECT tbl1.* FROM tbl1 JOIN tbl2 ON (tbl2.sname = tbl1.v_short)