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

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;

我想象在 zig LEFT JOIN 时应该没关系,因为我没有使用 zig 加入 bar baz 时的列。但是,在后者中, bar baz JOIN -ing吞噬了 zig 的行>有 null 值......为什么会这样?

有帮助吗?

解决方案

这很好用。我错了。

其他提示

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top