sqliteの複数のJOINステートメントの優先順位は何ですか?
-
03-07-2019 - |
質問
次の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を含めています。
これを書き始めたときに予想していたよりも明確に表現することは困難でした。意味があるかどうか教えてください。
所属していません StackOverflow