CROSS JOIN — это вообще зачем? Получаю слишком много строк
Делал отчёт и случайно написал запрос без условия соединения — получил декартово произведение, строк в десятки раз больше, чем ожидал. Потом узнал, что это и есть CROSS JOIN. Не пойму, в каких ситуациях он реально нужен и чем отличается от обычного JOIN.
SELECT *
FROM colors
CROSS JOIN sizes;
Если в colors 3 строки, а в sizes 2 — получаю 6. Это нормально или я что-то делаю не так?
2 ответа
6 строк — это абсолютно нормально, ты всё понял правильно. CROSS JOIN соединяет каждую строку первой таблицы с каждой строкой второй. Это и есть декартово произведение: 3 × 2 = 6.
Пример. Таблицы:
colors sizes
------ -----
красный S
синий M
зелёный
Запрос:
SELECT colors.name, sizes.label
FROM colors
CROSS JOIN sizes;
Результат — все возможные комбинации:
красный S
красный M
синий S
синий M
зелёный S
зелёный M
Чем отличается от обычного JOIN: у INNER JOIN есть условие ON, которое связывает строки по ключу (например, orders.user_id = users.id), поэтому лишних комбинаций нет. У CROSS JOIN условия нет — он намеренно перемножает всё со всем.
Когда реально полезен: сгенерировать все сочетания (цвет × размер для товаров), построить сетку дат × сотрудников для табеля, заготовить «пустой каркас» для отчёта. Во всех остальных случаях декартово произведение — это, как правило, баг (забыли ON или WHERE).
Маленький нюанс: запись FROM colors, sizes (через запятую, без ON) — это тот же CROSS JOIN, только в старом стиле. Именно так чаще всего и появляется случайное декартово произведение: написал несколько таблиц через запятую и забыл условие в WHERE. Так что CROSS JOIN лучше писать явно — тогда сразу видно, что перемножение умышленное.