sqlite中多个JOIN语句的优先级是多少?
问题描述:
以下两个查询返回不同的结果,出乎我的意料:sqlite中多个JOIN语句的优先级是多少?
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
上zig
,因为我当加入bar
和baz
时,不使用zig
的列。然而,看起来在后者中,JOIN
的bar
和baz
会吞噬zig
具有null
值的行...为什么是这样?
答
这工作正常。我错了。
答
这些不同是因为您的左连接在声明中的位置。请记住,连接不仅仅是您在比较字段的两个表格上,而是您加入该点和下一个表格的所有内容。
所以在你过滤掉了来自富行的第一条语句你的第一个连接(那些没有bar_id = bar.id)
但在第二条语句你是包括所有的foo用你的左手加入。
当我开始写这篇文章时,这比我预想的要难以表达,让我知道它对您是否有意义。
+1
但即使在第二条语句中,我将第一个左连接的所有foo包括在内,不应该在后一个连接中过滤出相同的行(没有bar_id的行)? – 2009-05-05 16:09:29
我开始怀疑这是对我的问题的不准确简化 - 这两个查询确实应该是相同的,我正在做其他事情。 – 2009-05-05 16:18:20