2009-05-04 66 views
5

以下两个查询返回不同的结果,出乎我的意料: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 JOINzig,因为我当加入barbaz时,不使用zig的列。然而,看起来在后者中,JOINbarbaz会吞噬zig具有null值的行...为什么是这样?

+0

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

回答

3

这工作正常。我错了。

2

这些不同是因为您的左连接在声明中的位置。请记住,连接不仅仅是您在比较字段的两个表格上,而是您加入该点和下一个表格的所有内容。

所以在你过滤掉了来自富行的第一条语句你的第一个连接(那些没有bar_id = bar.id)

但在第二条语句你是包括所有的foo用你的左手加入。

当我开始写这篇文章时,这比我预想的要难以表达,让我知道它对您是否有意义。

+1

但即使在第二条语句中,我将第一个左连接的所有foo包括在内,不应该在后一个连接中过滤出相同的行(没有bar_id的行)? – 2009-05-05 16:09:29