В этом руководстве вы узнаете о предложении SQL Server LEFT JOIN и о том, как запрашивать данные из нескольких таблиц.
Введение в предложение LEFT JOIN SQL Server
LEFT JOIN — это предложение оператора SELECT. Предложение LEFT JOIN позволяет запрашивать данные из нескольких таблиц.
LEFT JOIN возвращает все строки из левой таблицы и соответствующие строки из правой таблицы. Если в правой таблице не найдено соответствующих строк, используются NULL.
Ниже показано, как объединить две таблицы T1 и T2 с помощью предложения LEFT JOIN:
SELECT
select_list
FROM
T1
LEFT JOIN T2 ON
join_predicate;
В этом синтаксисе T1 и T2 — это левая и правая таблицы соответственно.
Для каждой строки из таблицы T1 запрос сравнивает ее со всеми строками из таблицы T2. Если пара строк приводит к тому, что предикат соединения оценивается как TRUE, значения столбцов из этих строк будут объединены для формирования новой строки, которая затем включается в набор результатов.
Если строка из левой таблицы(T1) не имеет соответствующей строки из таблицы T2, запрос объединяет значения столбцов строки из левой таблицы со значением NULL для каждого значения столбца из правой таблицы.
Короче говоря, предложение LEFT JOIN возвращает все строки из левой таблицы(T1) и соответствующие строки или значения NULL из правой таблицы(T2).
Ниже показано LEFT JOIN двух таблиц T1(1, 2, 3) и T2(A, B, C). LEFT JOIN сопоставит строки из таблицы T1 со строками из таблицы T2, используя шаблоны:

На этой иллюстрации ни одна строка из таблицы T2 не соответствует строке 1 из таблицы T1, поэтому используется NULL. Строки 2 и 3 из таблицы T1 соответствуют строкам A и B из таблицы T2 соответственно.
Пример LEFT JOIN для SQL Server
См. следующие таблицы products и order_items:

Каждая позиция заказа на продажу включает один продукт. Связь между таблицами order_items и products — столбец product_id.
В следующем операторе используется предложение LEFT JOIN для запроса данных из таблиц products и order_items:
SELECT
product_name,
order_id
FROM
production.products p
LEFT JOIN sales.order_items o ON o.product_id = p.product_id
ORDER BY
order_id;

Как ясно видно из набора результатов, список NULL в столбце order_id указывает на то, что соответствующие продукты еще не были проданы ни одному клиенту.
Можно использовать предложение WHERE для ограничения набора результатов. Следующий запрос возвращает продукты, которые не появляются ни в одном заказе на продажу:
SELECT
product_name,
order_id
FROM
production.products p
LEFT JOIN sales.order_items o ON o.product_id = p.product_id
WHERE order_id IS NULL

Как всегда, SQL Server обрабатывает предложение WHERE после предложения LEFT JOIN.
В следующем примере показано, как объединить три таблицы: production.products, sales.orders и sales.order_items с помощью предложений LEFT JOIN:

SELECT
p.product_name,
o.order_id,
i.item_id,
o.order_date
FROM
production.products p
LEFT JOIN sales.order_items i
ON i.product_id = p.product_id
LEFT JOIN sales.orders o
ON o.order_id = i.order_id
ORDER BY
order_id;
Вот что получилось:

SQL Server LEFT JOIN: условия в предложении ON и WHERE
Следующий запрос находит продукты, относящиеся к заказу с идентификатором 100:
SELECT
product_name,
order_id
FROM
production.products p
LEFT JOIN sales.order_items o
ON o.product_id = p.product_id
WHERE order_id = 100
ORDER BY
order_id;

Давайте перенесем условие order_id = 100 в предложение ON:
SELECT
p.product_id,
product_name,
order_id
FROM
production.products p
LEFT JOIN sales.order_items o
ON o.product_id = p.product_id AND
o.order_id = 100
ORDER BY
order_id DESC;

Запрос вернул все продукты, но только заказ с идентификатором 100 содержит связанную с ним информацию о продукте.
Обратите внимание, что для предложения INNER JOIN условие в предложении ON функционально эквивалентно, если оно помещено в предложение WHERE.
В этом руководстве вы узнали, как использовать предложение SQL Server LEFT JOIN для извлечения данных из нескольких связанных таблиц.




