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, только если вы точно уверены, что он вам нужен.

codechick

СodeСhick.io - простой и эффективный способ изучения программирования.

2024 ©