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