В этом руководстве вы узнаете, как использовать 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 создает в общей сложности девять строк.
Примеры 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;
На следующем рисунке показан частичный набор результатов:

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




