Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
CROSS JOIN в SQL
Определение
CROSS JOIN (декартово произведение) объединяет каждую строку первой таблицы с каждой строкой второй таблицы.
Формула: Если первая таблица содержит N строк, а вторая M строк, результат будет N × M строк.
Синтаксис
SELECT a.id, b.name
FROM table1 a
CROSS JOIN table2 b;
SELECT a.id, b.name
FROM table1 a, table2 b;
Практический пример
SELECT p.name, c.color
FROM products p
CROSS JOIN colors c;
Результат (4 строки):
name | color
Apple | Red
Apple | Yellow
Banana | Red
Banana | Yellow
Практические применения
1. Генерация комбинаций
SELECT s.size, c.color
FROM sizes s
CROSS JOIN colors c
WHERE s.size IN ('S', 'M', 'L')
AND c.color IN ('Red', 'Blue', 'Green');
2. Календарь всех дат
SELECT d.date, h.hour
FROM (SELECT CURRENT_DATE + INTERVAL day * 1 as date
FROM generate_series(0, 30) as t(day)) d
CROSS JOIN (SELECT * FROM generate_series(0, 23) as t(hour)) h;
3. Матрица расстояний
SELECT c1.city as from_city, c2.city as to_city,
ABS(c1.latitude - c2.latitude) + ABS(c1.longitude - c2.longitude) as distance
FROM cities c1
CROSS JOIN cities c2
WHERE c1.id < c2.id;
4. Каждый продукт на каждый день
SELECT p.product_id, d.date
FROM products p
CROSS JOIN (SELECT DISTINCT DATE(order_date) as date FROM orders) d
ORDER BY p.product_id, d.date;
Опасности CROSS JOIN
1. Взрыв данных
Таблица A: 1000 строк
Таблица B: 1000 строк
Результат CROSS JOIN: 1,000,000 строк!
Если A: 1M и B: 1M → результат 1 триллион строк → краш БД
2. Случайный CROSS JOIN
ПЛОХО: ошибка без ON условия
SELECT * FROM orders o JOIN customers c;
ХОРОШО: с ON clause
SELECT * FROM orders o JOIN customers c ON o.customer_id = c.id;
CROSS JOIN vs INNER JOIN
CROSS JOIN: каждый с каждым (без условия)
SELECT * FROM A CROSS JOIN B;
INNER JOIN: с условием ON
SELECT * FROM A JOIN B ON A.id = B.id;
Примеры для Data Science
Генерация features:
SELECT u.user_id, p.product_id,
CASE WHEN o.order_id IS NOT NULL THEN 1 ELSE 0 END as purchased
FROM users u
CROSS JOIN products p
LEFT JOIN orders o ON u.user_id = o.user_id AND p.product_id = o.product_id;
Временная шкала без пропусков:
SELECT d.date, p.product_id, COALESCE(s.sales, 0) as sales
FROM products p
CROSS JOIN (SELECT GENERATE_SERIES(DATE '2024-01-01', DATE '2024-12-31', INTERVAL '1 day')::date as date) d
LEFT JOIN sales s ON p.product_id = s.product_id AND d.date = s.date;
Оптимизация
ПЛОХО: CROSS JOIN без фильтра
SELECT * FROM A CROSS JOIN B;
ХОРОШО: ограничиваем результат
SELECT * FROM A CROSS JOIN B LIMIT 1000;
ХОРОШО: фильтруем перед CROSS JOIN
SELECT * FROM (SELECT * FROM A WHERE condition1) a
CROSS JOIN (SELECT * FROM B WHERE condition2) b;
Итог
CROSS JOIN — мощный инструмент для:
- Генерации комбинаций
- Заполнения пропусков в данных
- Создания полных матриц для анализа
Но используй с осторожностью: результат растёт экспоненциально! Всегда проверяй количество строк результата перед выполнением.