ホームページ > データベース > mysql チュートリアル > INNER JOIN は OUTER JOIN に含まれる NULL 値をオーバーライドしますか?

INNER JOIN は OUTER JOIN に含まれる NULL 値をオーバーライドしますか?

DDD
リリース: 2025-01-09 10:36:41
オリジナル
401 人が閲覧しました

Does an INNER JOIN Override an OUTER JOIN's Inclusion of NULL Values?

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 JOINemail は、一致する email_idpersonemail の両方に存在する行のみに結果を制限します。 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート