そこと3つのアプローチは、基本的には、次のとおりですnot exists
、not in
とleft join / is null
。
IS NULLを指定したLEFT JOIN
SELECT l.*
FROM t_left l
LEFT JOIN
t_right r
ON r.value = l.value
WHERE r.value IS NULL
ありませんで
SELECT l.*
FROM t_left l
WHERE l.value NOT IN
(
SELECT value
FROM t_right r
)
存在しない
SELECT l.*
FROM t_left l
WHERE NOT EXISTS
(
SELECT NULL
FROM t_right r
WHERE r.value = l.value
)
どちらがいいですか?この質問への答えは、主要な特定のRDBMSベンダーに分類する方がよいでしょう。一般的に言えば、select ... where ... in (select...)
サブクエリのレコード数の大きさが不明な場合は、使用を避ける必要があります。一部のベンダーはサイズを制限する場合があります。たとえば、Oracleの上限は1,000です。最善の方法は、3つすべてを試して実行計画を示すことです。
具体的にはPostgreSQLの実行計画を形成NOT EXISTS
し、LEFT JOIN / IS NULL
同じです。私は個人的にこのNOT EXISTS
オプションを好みます。結局のところ、そのpk が Bに存在しないというAのレコードを検索したいという意味です。
古いがまだゴールド、PostgreSQL固有:https : //explainextended.com/2009/09/16/not-in-vs-not-exists-vs-left-join-is-null-postgresql/