Перекрестное соединение SQL Server

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

Введение в предложение SQL Server CROSS JOIN

Перекрестное соединение позволяет объединить строки из первой таблицы с каждой строкой второй таблицы. Другими словами, оно возвращает декартово произведение двух таблиц.

Вот базовый синтаксис перекрестного соединения:

SELECT
  select_list
FROM
  T1
CROSS JOIN T2;

В этом синтаксисе:

  • T1 и T2 — это таблицы, для которых вы хотите выполнить перекрестное соединение.

В отличие от других типов соединений, таких как INNER JOIN или LEFT JOIN, перекрестное соединение не требует условия соединения.

Если таблица T1 содержит n строк, а таблица T2 содержит m строк, перекрестное соединение создаст результирующий набор с nxm строками.

Например, если обе таблицы T1 и T2 содержат 1000 строк, перекрестное соединение вернет набор результатов с 1 000 000 строк.

Поскольку перекрестное соединение может привести к созданию большого количества строк в результирующем наборе, следует использовать его с осторожностью, чтобы избежать проблем с производительностью.

Иллюстрация перекрестного соединения SQL Server

Предположим, что таблица T1 содержит три строки 1, 2 и 3, а таблица T2 содержит три строки A, B и C.

CROSS JOIN объединяет каждую строку из первой таблицы(T1) с каждой строкой во второй таблице(T2), создавая новую строку для каждой комбинации. Он повторяет этот процесс для каждой последующей строки в первой таблице(T1) и так далее.

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

На этой иллюстрации CROSS JOIN создает в общей сложности девять строк.

Примеры CROSS JOIN для SQL Server

Следующий оператор возвращает комбинации всех продуктов и магазинов:

SELECT
    product_id,
    product_name,
    store_id,
    0 AS quantity
FROM
    production.products
CROSS JOIN sales.stores
ORDER BY
    product_name,
    store_id;

Выход:

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

Следующий оператор находит товары, которые не продаются в магазинах:

SELECT
    s.store_id,
    p.product_id,
    ISNULL(sales, 0) sales
FROM
    sales.stores s
CROSS JOIN production.products p
LEFT JOIN(
    SELECT
        s.store_id,
        p.product_id,
        SUM(quantity * i.list_price) sales
    FROM
        sales.orders o
    INNER JOIN sales.order_items i ON i.order_id = o.order_id
    INNER JOIN sales.stores s ON s.store_id = o.store_id
    INNER JOIN production.products p ON p.product_id = i.product_id
    GROUP BY
        s.store_id,
        p.product_id
) c ON c.store_id = s.store_id
AND c.product_id = p.product_id
WHERE
    sales IS NULL
ORDER BY
    product_id,
    store_id;

На следующем рисунке показан частичный набор результатов:

SQL Server Cross Join StockПример

Краткое содержание

  • Используйте CROSS JOIN для объединения строк из первой таблицы с каждой строкой из второй таблицы.
Мирослав С.

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