Левое соединение SQL Server

В этом руководстве вы узнаете о предложении 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, используя шаблоны:

ЛЕВОЕ СОЕДИНЕНИЕ SQL Server

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

Пример LEFT JOIN для SQL Server

См. следующие таблицы products и order_items:

Таблицы order_items и products

Каждая позиция заказа на продажу включает один продукт. Связь между таблицами 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;

Пример левого соединения SQL Server

Как ясно видно из набора результатов, список 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 Left Join находит несоответствующие строки

Как всегда, 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 — соединение трех таблиц

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;

SQL Server Left Join и предложение WHERE

Давайте перенесем условие 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;

SQL Server LEFT JOIN — переместить условие в предложение ON

Запрос вернул все продукты, но только заказ с идентификатором 100 содержит связанную с ним информацию о продукте.

Обратите внимание, что для предложения INNER JOIN условие в предложении ON функционально эквивалентно, если оно помещено в предложение WHERE.

В этом руководстве вы узнали, как использовать предложение SQL Server LEFT JOIN для извлечения данных из нескольких связанных таблиц.

Мирослав С.

Автор статей, ИБ-специалист