В то время как большинство соединений требуют определенного условия соответствия (предложение ON), CROSS JOIN работает иначе. Он возвращает все возможные комбинации строк из соединяемых таблиц. Этот результат в математике известен как декартово произведение.
CROSS JOIN создает результирующий набор, где количество строк равно произведению количества строк в первой таблице на количество строк во второй таблице. Для сопоставления строк не используется никакое условие; каждая строка таблицы А просто встречается с каждой строкой таблицы Б.
Визуализация:
Таблица A (Цвета) Таблица B (Размеры)
+-----------+ +-----------+
| цвет | | размер |
+-----------+ +-----------+
| Красный | --\ | S |
| Синий | ---|------> | M |
+-----------+ --/ | L |
+-----------+
Результат (Комбинации):
Красный, S
Красный, M
Красный, L
Синий, S
Синий, M
Синий, L
Если в таблице А 2 строки, а в таблице Б 3 строки, результат будет содержать 2 x 3 = 6 строк.
Существует два способа записи CROSS JOIN. Явный способ предпочтительнее для ясности:
-- Явный синтаксис (рекомендуется)
SELECT
table1.column,
table2.column
FROM
table1
CROSS JOIN
table2;
-- Неявный синтаксис (старый стиль)
SELECT
table1.column,
table2.column
FROM
table1,
table2;
Предупреждение: Будьте крайне осторожны при использовании
CROSS JOINна больших таблицах. Соединение двух таблиц по 1000 строк в каждой даст 1 000 000 строк!
Представьте, что нам нужно создать отчет или сетку, которая показывает все категории фильмов для каждого магазина, даже если в этом магазине сейчас нет фильмов такой категории.
SELECT
s.store_id,
c.name AS category_name
FROM
store AS s
CROSS JOIN
category AS c;
Это создаст список всех категорий для Магазина 1, за которым последует список всех категорий для Магазина 2.
CROSS JOIN часто используется для генерации больших наборов перестановок для тестирования или для построения календарей/расписаний, где нужно сопоставить все временные интервалы со всеми пользователями.
LEFT JOIN это может помочь выявить отсутствующие комбинации в ваших данных.ON (нет условия сопоставления).