SQL における INNER JOIN と OUTER JOIN の相互作用を理解する
複雑な SQL クエリでは、さまざまな JOIN タイプを組み合わせた複数の JOIN 操作が頻繁に使用されます。 重要な考慮事項は、OUTER JOIN の特性である NULL 値の包含が、後で INNER JOIN が適用されたときにどのような影響を受けるかということです。
内部結合が外部結合の結果に与える影響
INNER JOIN は、その性質上、両方 テーブルで結合条件が満たされる行のみを返します。 INNER JOIN が OUTER JOIN の後に続き、INNER JOIN の条件が (OUTER JOIN により) NULL になる可能性のある列に依存する場合、それらの列が NULL である行は効果的にフィルターで除外されます。これにより、OUTER JOIN が最初に提供した NULL 値の包含が無効になります。
具体例
シナリオを調べてみましょう:
<code class="language-sql">SELECT * FROM person LEFT JOIN address ON person.address_id = address.id INNER JOIN email ON person.email_id = email.id;</code>
LEFT JOIN
は、person
に一致するエントリがない場合でも、address
テーブルのすべての行が確実に含まれるようにします。 ただし、INNER JOIN
と email
は、一致する email_id
が person
と email
の両方に存在する行のみに結果を制限します。 person
に一致するが NULL address
がある email_id
の行は除外されます。
問題のあるシナリオとその解決策
次のクエリについて考えてみましょう:
<code class="language-sql">SELECT * FROM person LEFT JOIN address ON person.address_id = address.id INNER JOIN city ON address.city_id = city.id;</code>
ここで、INNER JOIN
を伴う city
は、address.city_id
が NULL ではないことを前提としています。 一部のアドレスに city_id
がない場合、それらの行 (および関連する person
行) が省略され、最初の LEFT JOIN
.
正しいアプローチは、LEFT JOIN
の代わりに別の INNER JOIN
を使用することです:
<code class="language-sql">SELECT * FROM person LEFT JOIN address ON person.address_id = address.id LEFT JOIN city ON address.city_id = city.id;</code>
これにより、最初の LEFT JOIN
の包含性が維持され、address.city_id
が NULL である可能性のあるケースが正しく処理されます。 これにより、住所や都市が関連付けられているかどうかに関係なく、すべての person
レコードが確実に含まれるようになります。
以上がINNER JOIN は OUTER JOIN に含まれる NULL 値をオーバーライドしますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。