← Назад к вопросам

Что такое CROSS JOIN?

1.3 Junior🔥 191 комментариев
#SQL и базы данных

Комментарии (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 — мощный инструмент для:

  • Генерации комбинаций
  • Заполнения пропусков в данных
  • Создания полных матриц для анализа

Но используй с осторожностью: результат растёт экспоненциально! Всегда проверяй количество строк результата перед выполнением.