CROSS JOIN в SQL

Если при объединении двух таблиц вы не укажете условие объединения, система базы данных объединит каждую строку из первой таблицы с каждой строкой из второй таблицы. Такой тип объединения называется CROSS JOIN, а также перекрестным или декартовым произведением. Следующая диаграмма Венна иллюстрирует работу CROSS JOIN.

Чтобы понять, как работает CROSS JOIN, давайте рассмотрим следующие таблицы employees и departments.

 
Таблица employees Таблица departments
+--------+--------------+------------+---------+
| emp_id | emp_name     | hire_date  | dept_id |
+--------+--------------+------------+---------+
|      1 | Ethan Hunt   | 2001-05-01 |       4 |
|      2 | Tony Montana | 2002-07-15 |       1 |
|      3 | Sarah Connor | 2005-10-18 |       5 |
|      4 | Rick Deckard | 2007-01-03 |       3 |
|      5 | Martin Blank | 2008-06-24 |    NULL |
+--------+--------------+------------+---------+
+---------+------------------+
| dept_id | dept_name        |
+---------+------------------+
|       1 | Administration   |
|       2 | Customer Service |
|       3 | Finance          |
|       4 | Human Resources  |
|       5 | Sales            |
+---------+------------------+

Количество строк в CROSS JOIN — это произведение количества строк в каждой таблице. Далее приведен простой пример операции перекрестного объединения.

SELECT t1.emp_id, t1.emp_name, t1.hire_date, t2.dept_name FROM employees AS t1 CROSS JOIN departments AS t2;

Примечание. CROSS JOIN создает декартово произведение или, иными словами, умножение всех строк одной таблицы на все строки другой. Так, например, если в одной таблице 5 строк, а в другой 10 строк, запрос с CROSS JOIN выдаст 50 строк — произведение 5 и 10.

После выполнения приведенной выше команды вы получите набор результатов примерно следующего вида:

+--------+--------------+------------+------------------+
| emp_id | emp_name     | hire_date  | dept_name        |
+--------+--------------+------------+------------------+
|      1 | Ethan Hunt   | 2001-05-01 | Administration   |
|      2 | Tony Montana | 2002-07-15 | Administration   |
|      3 | Sarah Connor | 2005-10-18 | Administration   |
|      4 | Rick Deckard | 2007-01-03 | Administration   |
|      5 | Martin Blank | 2008-06-24 | Administration   |
|      1 | Ethan Hunt   | 2001-05-01 | Customer Service |
|      2 | Tony Montana | 2002-07-15 | Customer Service |
|      3 | Sarah Connor | 2005-10-18 | Customer Service |
|      4 | Rick Deckard | 2007-01-03 | Customer Service |
|      5 | Martin Blank | 2008-06-24 | Customer Service |
|      1 | Ethan Hunt   | 2001-05-01 | Finance          |
|      2 | Tony Montana | 2002-07-15 | Finance          |
|      3 | Sarah Connor | 2005-10-18 | Finance          |
|      4 | Rick Deckard | 2007-01-03 | Finance          |
|      5 | Martin Blank | 2008-06-24 | Finance          |
|      1 | Ethan Hunt   | 2001-05-01 | Human Resources  |
|      2 | Tony Montana | 2002-07-15 | Human Resources  |
|      3 | Sarah Connor | 2005-10-18 | Human Resources  |
|      4 | Rick Deckard | 2007-01-03 | Human Resources  |
|      5 | Martin Blank | 2008-06-24 | Human Resources  |
|      1 | Ethan Hunt   | 2001-05-01 | Sales            |
|      2 | Tony Montana | 2002-07-15 | Sales            |
|      3 | Sarah Connor | 2005-10-18 | Sales            |
|      4 | Rick Deckard | 2007-01-03 | Sales            |
|      5 | Martin Blank | 2008-06-24 | Sales            |
+--------+--------------+------------+------------------+

Как вы видите, CROSS JOIN не так полезен, как другие типы объединений, которые мы рассматривали в предыдущих статьях. Поскольку в запросе не было указано условие объединения, каждая строка из таблицы employees объединилась с каждой строкой из таблицы departments. Так что лучше использовать CROSS JOIN, только если вы точно уверены, что он вам нужен.

Проверьте себя
1. Сколько строк вернёт CROSS JOIN таблицы A (3 строки) с таблицей B (4 строки)?
A12 строк
B3 строки
C4 строки
D7 строк
2. Что отличает CROSS JOIN от других видов JOIN?
ACROSS JOIN не требует условия соединения ON — каждая строка соединяется с каждой
BCROSS JOIN возвращает только несовпадающие строки
CCROSS JOIN работает только с таблицами одинакового размера
DCROSS JOIN можно использовать только со строковыми столбцами
3. В таблице employees 5 строк, в departments — 5 строк. Запрос SELECT t1.emp_name, t2.dept_name FROM employees AS t1 CROSS JOIN departments AS t2. Сколько строк в результате?
A5 строк
B10 строк
C25 строк
D0 строк
4. В каком случае CROSS JOIN может быть полезен?
AКогда нужно объединить таблицы по внешнему ключу
BКогда нужно найти строки без совпадений
CКогда нужно агрегировать данные по группам
DКогда нужно получить все возможные комбинации значений из двух наборов (например, все пары товар/размер)