EXISTSを使用する 式:
WHERE NOT EXISTS (
SELECT FROM votes v -- SELECT list can be empty
WHERE v.some_id = base_table.some_id
AND v.user_id = ?
)
違い
... NOT EXISTS()の間 (Ⓔ)およびNOT IN() (Ⓘ)は2つあります:
-
パフォーマンス
Ⓔは一般的に高速です。最初の一致が見つかるとすぐにサブクエリの処理を停止します。マニュアル:
サブクエリは通常、完了までではなく、少なくとも1つの行が返されるかどうかを判断するのに十分な時間だけ実行されます。
Ⓘはクエリプランナーで最適化することもできますが、
NULL以降はそれほどではありません。 処理がより複雑になります。 -
正しさ
サブクエリ式の結果の値の1つが
NULLの場合 、Ⓘの結果はNULLです 、一般的なロジックはTRUEを期待しますが -およびⒺはTRUEを返します 。マニュアル:行ごとのすべての結果が等しくないかnullであり、少なくとも1つのnullがある場合、
NOT INの結果 nullです。
基本的に、(NOT) EXISTS ほとんどの場合、より良い選択です。
例
クエリは次のようになります:
SELECT *
FROM questions q
WHERE NOT EXISTS (
SELECT FROM votes v
WHERE v.question_id = q.id
AND v.user_id = ?
);
しない votesに参加する 基本クエリで。それは努力を無効にするでしょう。
NOT EXISTS以外に およびNOT IN LEFT JOIN / IS NULLには追加の構文オプションがあります およびEXCEPT 。参照:
- 他のテーブルに存在しない行を選択します