5

驚いたことに、次の 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;

と:

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;

と を結合するときに の列を使用していないため、がLEFT JOINオンのときは問題にならないと想像しています。ただし、後者では、-ingが値を持っていた行を飲み込んでいるように見えます...なぜですか?zigzigbarbazJOINbarbazzignull

4

2 に答える 2

3

これはうまくいきます。私は間違っていた。

于 2009-08-30T10:01:18.360 に答える
2

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

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

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

これを書き始めたときに予想していたよりも明確に説明するのが難しかったので、理解できるかどうか教えてください。

于 2009-05-04T22:15:46.803 に答える