sqlite中多个JOIN语句的优先级是什么?
-
03-07-2019 - |
题
令我惊讶的是,以下两个查询返回了不同的结果:
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中。
当我开始写这篇文章时,这比我预想的更难表达,让我知道你是否有意义。
不隶属于 StackOverflow