FULL JOIN в SQL сочетает результаты как левого и правого внешнего соединения.
Объединенная таблица будет содержать все записи из обеих таблиц и заполнит значения NULL для отсутствующих колонок с обеих сторон.
Основной синтаксис FULL JOIN следующий:
SELECT table1.column1, table2.column2... FROM table1 FULL JOIN table2 ON table1.common_field = table2.common_field;
Здесь, данное условие может быть любое данное выражение основано на вашем требовании.
Рассмотрим следующие две таблицы.
Таблица 1 – Таблица CUSTOMERS выглядит следующим образом:
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Maxim | 35 | Moscow | 21000.00 | | 2 | AndreyEx | 38 | Krasnodar | 55500.00 | | 3 | Oleg | 33 | Rostov | 34000.00 | | 4 | Masha | 35 | Moscow | 34000.00 | | 5 | Ruslan | 34 | Omsk | 45000.00 | | 6 | Dima | 32 | SP | 45000.00 | | 7 | Roma | 34 | SP | 10000.00 | +----+----------+-----+-----------+----------+
Таблица 2 – Таблица ORDERS выглядит следующим образом:
+-----+---------------------+-------------+--------+ |OID | DATE | CUSTOMER_ID | AMOUNT | +-----+---------------------+-------------+--------+ | 102 | 2017-01-11 00:00:00 | 3 | 34000 | | 100 | 2017-01-11 00:00:00 | 3 | 34000 | | 101 | 2017-02-02 00:00:00 | 2 | 12500 | | 103 | 2017-03-05 00:00:00 | 4 | 45000 | +-----+---------------------+-------------+--------+
Теперь, давайте объединим эти две таблицы, используя FULL JOIN следующим образом.
SQL> SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS FULL JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;
Это произведет следующий результат:
+----+----------+--------+---------------------+ | ID | NAME | AMOUNT | DATE | +----+----------+--------+---------------------+ | 1 | Maxim | NULL | NULL | | 3 | Oleg | 34000 | 2017-01-11 00:00:00 | | 3 | Oleg | 34000 | 2017-01-11 00:00:00 | | 2 | AndreyEx | 12500 | 2017-02-02 00:00:00 | | 4 | Masha | 45000 | 2017-03-05 00:00:00 | | 5 | Ruslan | NULL | NULL | | 6 | Dima | NULL | NULL | | 7 | Roma | NULL | NULL | | 3 | Oleg | 34000 | 2017-01-11 00:00:00 | | 3 | Oleg | 34000 | 2017-01-11 00:00:00 | | 2 | AndreyEx | 12500 | 2017-02-02 00:00:00 | | 4 | Masha | 45000 | 2017-03-05 00:00:00 | +----+----------+--------+---------------------+
Если база данных не поддерживает полное объединение (MySQL не поддерживает FULL JOIN), то вы можете использовать оператор UNION ALL, чтобы объединить эти два JOINS, как показано ниже.
SQL> SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS LEFT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID UNION ALL SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS RIGHT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID
dfd