5

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

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,因为在加入and时zig我没有使用zig' 列。但是,似乎在后者中,-ing和吞噬了具有值的行......为什么会这样?barbazJOINbarbazzignull

4

2 回答 2

3

这工作正常。我错了。

于 2009-08-30T10:01:18.360 回答
2

这些是不同的,因为您的左连接在语句中的位置。请记住,连接不仅在您正在比较字段的两个表上,而且还包括您在该点和下一个表上连接的所有内容。

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

但是在第二个语句中,您将所有 foo 包含在左连接中。

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

于 2009-05-04T22:15:46.803 回答