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

Есть ли разница в результате между двумя подходами к соединению трех таблиц: <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`.

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

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

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

Таким образом, правильный порядок соединений должен определяться в зависимости от вашей конкретной задачи и структуры данных.
<a href="https://sky.pro/wiki/sql/ispolzovanie-neskolkikh-left-join-v-zaprose-sql-sintaksis/" rel="nofollow">Использование нескольких LEFT JOIN</a> .
<blockquote>Будет ли разница в результате между двумя вариантами</blockquote> <br/> Да. См. <a href="https://dbfiddle.uk/vYkMp-UI" rel="nofollow">fiddle</a> <br/> <pre><code class="sql">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';</code></pre> <br/> <pre><code class="sql">select a.*, b.*, c.*
from a left join b using (x) left join c using (x)</code></pre> <br/> <pre><code>x	x	x
a	a	null
b	null	b</code></pre> <br/> <pre><code class="sql">select a.*, b.*, c.*
from a left join (b left join c using (x))  using (x)</code></pre> <br/> <pre><code>x	x	x
a	a	null
b	null	null</code></pre> <br/> <br/> <blockquote>Есть ли какое-то правило, которое определяет порядок связывания таблиц?</blockquote> <br/> Да. Порядок связывания определяется требуемой логикой. <br/> <br/> <b>PS. </b> В качестве самостоятельного задания - найди истинную причину разницы. <br/> <br/> <b>PPS. </b> При абсолютной эквивалентности обеих форм - разницы нет.
Похожие вопросы