Подтвердить что ты не робот

Присоединиться к порядку операции

Учитывая следующее трехстороннее соединение

select t1.* from t1
left join t2 on t1.fk = t2.pk
join t3 on t2.fk = t3.pk

Если соединение между t2 и t3 не удалось, будет ли возвращена строка из успешного соединения между t1 и t2? Если порядок работы идет слева направо, я предполагаю, что нет, но если он оценивается справа налево (сначала t3 соединяется с t2), то t1 все равно будет возвращен даже тогда, когда первый не удалось.

Как это работает?

4b9b3361

Ответ 1

Размещение предложений ON контролирует порядок оценки логический.

Итак, сначала происходит t1 LEFT JOIN t2 ON t1.fk = t2.pk. Результатом этого объединения является виртуальная таблица, содержащая все соответствующие строки из t1, t2 и (поскольку это левое внешнее объединение), любые несогласованные строки t1 также сохраняются с нулевыми значениями для столбцов t2.

Эта виртуальная таблица затем участвует в следующем соединении. JOIN t3 ON t2.fk = t3.pk

Любые записи t2, которые не соответствуют строкам в t1, не являются частью виртуальной таблицы, выводимой с первого этапа, поэтому не будут отображаться в конечном результате. Кроме того, это внутреннее соединение на t2.fk = t3.pk потеряет любые значения NULL t2.fk, превратив все ваше дело во внутренние соединения.

Логическая обработка запросов объясняется здесь здесь Itzik Ben Gan