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
。参照:
- 他のテーブルに存在しない行を選択します