質問

次の2つのクエリは異なる結果を返しますが、驚いたことに

SELECT *
  FROM foo
       JOIN bar
         ON bar.id=foo.bar_id

       JOIN baz
         ON baz.id=foo.baz_id

       LEFT JOIN zig
         ON zig.foo_id=foo.id;

and:

SELECT *
  FROM foo
       LEFT JOIN zig
         ON zig.foo_id=foo.id

       JOIN bar
         ON bar.id=foo.bar_id

       JOIN baz
         ON baz.id=foo.baz_id;

zig を使用していないため、 zig LEFT JOIN を実行しても問題ないことを想像しています。 bar baz を結合するときの列。ただし、後者では、 bar baz JOIN -ingにより、 zig null 値がありました...なぜですか?

役に立ちましたか?

解決

これは正常に動作します。私は間違っていた。

他のヒント

これらは、左結合がステートメントのどこにあるかによって異なります。結合は、フィールドを比較する2つのテーブルだけでなく、そのポイントと次のテーブルまでに結合したすべてのものであることに注意してください。

したがって、最初のステートメントでは、最初の結合(bar_id = bar.idを持たないもの)でfooから行をフィルターで除外しています

しかし、2番目のステートメントでは、左結合にすべてのfooを含めています。

これを書き始めたときに予想していたよりも明確に表現することは困難でした。意味があるかどうか教えてください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top