sqlite中多个JOIN语句的优先级是什么?

时间:2009-05-04 18:06:08

标签: sql sqlite join left-join outer-join

令我惊讶的是,以下两个查询返回了不同的结果:

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 zig上的zig无关紧要,因为我在加入bar时没有使用bazJOIN。但是,在后者中,barbaz的{​​{1}}吞噬了zig具有null值的行...为什么那是吗?

2 个答案:

答案 0 :(得分:3)

这很好用。我错了。

答案 1 :(得分:2)

这些是不同的,因为您的左连接在语句中的位置。请记住,联接不仅仅是您要比较字段的两个表,而是您加入到该点和下一个表的所有内容。

因此,在第一个语句中,您将在第一个联接中过滤掉foo中的行(那些没有bar_id = bar.id的行)

但是在第二个声明中,您将左边的连接包含在所有foo中。

当我开始写这篇文章时,这比我预想的更难表达,让我知道你是否有意义。