Как влияет порядок связывания таблиц при использовании левого соединения?

Есть ли разница в результате между двумя подходами к соединению трех таблиц: <b>A, B, C</b>? 

В первом подходе таблица <b>A</b> сначала соединяется левым соединением с таблицей <b>B</b>, а затем полученный результат соединяется левым соединением с таблицей <b>C</b>. 

Во втором подходе таблица <b>B</b> сначала соединяется левым соединением с таблицей <b>C</b>, и затем таблица <b>A</b> соединяется с результатом первого соединения левым соединением. 

Предполагаем, что условия связи таблиц в обоих вариантах одинаковы. Существует ли какое-либо правило, которое определяет порядок соединения таблиц?
  • 21 февраля 2025 г. 9:14
Ответы на вопрос 3
Да, порядок связывания таблиц при использовании левого соединения (`LEFT JOIN`) действительно может влиять на конечный результат, особенно если в одной из таблиц (или нескольких) присутствуют строки, которые не соответствуют условиям соединения.

### Объяснение через примеры

Рассмотрим два случая:

1. **Первый подход:**
   ```sql
   SELECT *
   FROM A
   LEFT JOIN B ON A.id = B.a_id
   LEFT JOIN C ON B.id = C.b_id;
   ```
   Здесь сначала соединяются таблицы `A` и `B`. Все строки из `A` будут присутствовать в результате, даже если у них нет соответствующих строк в `B`. Далее к этому результату добавляется `C`, и строки из `C` будут добавлены только на основе соответствия с уже полученными строками из `B`.

2. **Второй подход:**
   ```sql
   SELECT *
   FROM B
   LEFT JOIN C ON B.id = C.b_id
   LEFT JOIN A ON A.id = B.a_id;
   ```
   Здесь сначала соединяются `B` и `C`. Затем результат этого соединения соединяется с `A`. В этом случае, если в результатах `B` нет строк (т.е. не будет строк, соответствующих `C`), то при соединении с `A` у нас могут возникнуть пропуски для строк из `A`, если они не имеют соответствующих строк в `B`.

### Следствия и правила

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

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

Таким образом, правильный порядок соединений должен определяться в зависимости от вашей конкретной задачи и структуры данных.
Будет ли разница в результате между двумя вариантами

Да. См. fiddle
CREATE TABLE a SELECT 'a' x UNION SELECT 'b';
CREATE TABLE b SELECT 'a' x UNION SELECT 'c';
CREATE TABLE c SELECT 'b' x UNION SELECT 'c';

select a.*, b.*, c.*
from a left join b using (x) left join c using (x)

x	x	x
a	a	null
b	null	b

select a.*, b.*, c.*
from a left join (b left join c using (x))  using (x)

x	x	x
a	a	null
b	null	null


Есть ли какое-то правило, которое определяет порядок связывания таблиц?

Да. Порядок связывания определяется требуемой логикой.

PS. В качестве самостоятельного задания - найди истинную причину разницы.

PPS. При абсолютной эквивалентности обеих форм - разницы нет.
Похожие вопросы