← Все вопросы

CROSS JOIN — это вообще зачем? Получаю слишком много строк

Задан 3 месяца назад287 просмотров2 ответа
7

Делал отчёт и случайно написал запрос без условия соединения — получил декартово произведение, строк в десятки раз больше, чем ожидал. Потом узнал, что это и есть CROSS JOIN. Не пойму, в каких ситуациях он реально нужен и чем отличается от обычного JOIN.

SELECT *
FROM colors
CROSS JOIN sizes;

Если в colors 3 строки, а в sizes 2 — получаю 6. Это нормально или я что-то делаю не так?

2 ответа

12
✓ Принятый ответ — помог автору

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).

5

Маленький нюанс: запись FROM colors, sizes (через запятую, без ON) — это тот же CROSS JOIN, только в старом стиле. Именно так чаще всего и появляется случайное декартово произведение: написал несколько таблиц через запятую и забыл условие в WHERE. Так что CROSS JOIN лучше писать явно — тогда сразу видно, что перемножение умышленное.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект