Каков приоритет нескольких операторов JOIN в sqlite? - PullRequest
5 голосов
/ 04 мая 2009

К моему удивлению, следующие два запроса дают разные результаты:

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

Ответы [ 2 ]

3 голосов
/ 30 августа 2009

Это отлично работает. Я был не прав.

2 голосов
/ 05 мая 2009

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

Итак, в первом утверждении вы отфильтровываете строки из foo при первом соединении (те, у которых нет bar_id = bar.id)

но во втором утверждении вы включаете все foo в левое соединение.

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

...