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;
我想你在zig
上LEFT JOIN
应该没关系,因为在加入bar
和baz
时我没有使用zig
的列。但是,似乎在后者中,bar
和 baz
的 JOIN
-ing 吞噬了 zig
具有 null
值的行...这是为什么呢?
【问题讨论】:
我开始怀疑这是对我的问题的不准确简化 - 这两个查询确实应该是相同的,我正在做其他事情。 【参考方案1】:这些是不同的,因为您的左连接在语句中的位置。请记住,联接不仅针对您要比较字段的两个表,还包括您在该点和下一个表之前联接的所有内容。
因此,在第一个语句中,您将在第一次连接中从 foo 中过滤掉行(那些没有 bar_id = bar.id 的行)
但在第二个语句中,您将所有 foo 包含在左连接中。
这比我开始写这篇文章时的预期更难表达,如果对你有意义,请告诉我。
【讨论】:
但是,即使在第二个语句中,我将所有 foo 与第一个左连接包括在内,不应该在后者中过滤掉相同的行(没有 bar_id 的行)加入?【参考方案2】:这很好用。我错了。
【讨论】:
以上是关于sqlite中多个JOIN语句的优先级是啥?的主要内容,如果未能解决你的问题,请参考以下文章
sql中 group by 的优先级高 还是 join的优先级高?
在现有的数据库优先多个 .NET Core 项目解决方案中迁移到代码优先的最佳方法是啥?