Концепция SQL JOIN - PullRequest
       5

Концепция SQL JOIN

0 голосов
/ 16 мая 2018

В последнее время я так запутался в порядке выполнения SQL JOIN.Предположим, у меня есть 3 такие таблицы: image

, и это запрос:

 SELECT * 
 FROM Table_a a 
 LEFT JOIN Table_b b ON a.id=b.id
 INNER JOIN table_c c ON b.id=c.id

Как вы думаете, какой будет результат?согласно тому, что я прочитал на нескольких веб-страницах, порядок не повлияет на результат.

Это то, что я думал, что результатом будет левое соединение B, то результатом будет внутреннее соединение с C. Таким образом, от того, какой результат левого соединения B будет зависеть, будет зависеть результат конечного результата.Пожалуйста, поправьте меня, если я ошибаюсь

1 Ответ

0 голосов
/ 16 мая 2018

Этот запрос:

SELECT *
FROM Table_a a LEFT JOIN
     Table_b b
     ON a.id = b.id INNER JOIN
     Table_c c
     ON b.id = c.id;

Эквивалентно:

SELECT *
FROM Table_a a INNER JOIN
     Table_b b
     ON a.id = b.id INNER JOIN
     table_c c
     ON b.id = c.id;

А?Как это превращается во внутреннее соединение?Ну, во-первых, теперь SQL интерпретируется слева направо, поэтому ваш запрос интерпретируется как:

SELECT *    
FROM (Table_a a LEFT JOIN
      Table_b b
      ON a.id = b.id
     ) INNER JOIN
     table_c c ON b.id = c.id;

То есть b в последнем условии является результатом left join.Если совпадений нет, то b.id равно null и условие не соответствует действительности.Следовательно, все эти строки отфильтрованы.

Я рекомендую следующие правила при работе с объединениями:

  • Сначала поставьте все INNER JOIN.
  • Использование LEFT JOIN с для всех последующих объединений.
  • Не используйте RIGHT JOIN с.

Для меня это работает примерно для 99,9% запросов.В некоторых случаях предпочтительнее использовать альтернативные методы - для них я обычно использую подзапросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...