【问题标题】:What is the precedence of multiple JOIN statements in sqlite?sqlite中多个JOIN语句的优先级是什么?
【发布时间】:2010-10-23 16:50:40
【问题描述】:

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

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;

我想你在zigLEFT JOIN 应该没关系,因为在加入barbaz 时我没有使用zig 的列。但是,似乎在后者中,barbazJOIN-ing 吞噬了 zig 具有 null 值的行...这是为什么呢?

【问题讨论】:

  • 我开始怀疑这是对我的问题的不准确简化 - 这两个查询确实应该是相同的,我正在做其他事情。

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


【解决方案1】:

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

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

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

这比我开始写这篇文章时的预期更难表达,如果对你有意义,请告诉我。

【讨论】:

  • 但是,即使在第二个语句中,我将所有 foo 与第一个左连接包括在内,不应该在后者中过滤掉相同的行(没有 bar_id 的行)加入?
【解决方案2】:

这很好用。我错了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 2012-07-11
    • 2013-03-29
    • 2018-02-22
    • 2018-06-13
    相关资源
    最近更新 更多