これには基本的に3つのアプローチがあります:not exists
、、。not in
left join / is null
ISNULLの左結合
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/