2009-05-04 2 views
5

Следующие два запроса возвращаются разные результаты, к моему удивлению:Каково преимущество нескольких операторов JOIN в sqlite?

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, так как я м, не используя колонки zig при присоединении к bar и baz. Однако, по-видимому, в последнем случае JOIN -ing bar и baz поглощает строки, где zig имеет значения null ... почему это так?

+0

Я начинаю подозревать, что это было неточное упрощение моей проблемы - эти два вопроса действительно должны быть идентичными, я делал что-то еще. –

ответ

3

Это прекрасно работает. Я был неправ.

2

Это разные из-за того, где ваше левое соединение находится в инструкции. Помните, что объединение происходит не только на двух таблицах, на которые вы сравниваете поля, а скорее на том, что вы присоединили к этой точке и следующей таблице.

Таким образом, в первом заявлении вы отфильтровывая строки из обув в вашем первом присоединиться (те, которые не имеют bar_id = bar.id)

но во втором заявлении вы включая все обув с левым присоединиться.

Это было труднее сформулировать, чем я ожидал, когда начал писать это, дайте мне знать, если это имеет смысл для вас.

+1

Но даже если во втором утверждении я включаю все foo с первым левым соединением, не должны ли быть отфильтрованы те же строки (те, которые не имеют bar_id) в последнем соединении? –

Смежные вопросы