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

Posted

技术标签:

【中文标题】sqlite中多个JOIN语句的优先级是啥?【英文标题】: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 值的行...这是为什么呢?

【问题讨论】:

我开始怀疑这是对我的问题的不准确简化 - 这两个查询确实应该是相同的,我正在做其他事情。 【参考方案1】:

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

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

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

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

【讨论】:

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

这很好用。我错了。

【讨论】:

以上是关于sqlite中多个JOIN语句的优先级是啥?的主要内容,如果未能解决你的问题,请参考以下文章

sql中 group by 的优先级高 还是 join的优先级高?

在现有的数据库优先多个 .NET Core 项目解决方案中迁移到代码优先的最佳方法是啥?

sql中where的与jnner join on的连接条件.哪个优先级别高?

新的 C# 8.0 开关表达式的运算符优先级是啥?

mysql中查询的优先级

c语言中规定 赋值运算符的左边必须是啥?