Le FULL OUTER JOIN est le type de jointure le plus inclusif. Il retourne toutes les lignes lorsqu'il y a une correspondance dans l'une ou l'autre table. C'est essentiellement une combinaison de LEFT JOIN et de RIGHT JOIN.
Un FULL OUTER JOIN crée un résultat qui inclut tous les enregistrements des deux tables :
Visualisation :
Table A (potential_leads) Table B (active_clients)
+----+----------+ +----+----------+
| id | name | | id | status |
+----+----------+ +----+----------+
| 1 | Alice | <--------> | 1 | Active | (Correspondance !)
| 2 | Bob | <--------? | NULL | (Lead uniquement, pas encore client)
| NULL | <--------> | 3 | Active | (Client uniquement, pas dans les leads)
+----+----------+ +----+----------+
SELECT
table1.column1,
table2.column2
FROM
table1
FULL OUTER JOIN
table2 ON table1.common_column = table2.common_column;
Attention à la compatibilité : Toutes les bases de données ne supportent pas
FULL OUTER JOINnativement.
- PostgreSQL, SQL Server et Oracle le supportent.
- MySQL et MariaDB ne le supportent PAS.
Comme MySQL ne propose pas FULL OUTER JOIN, on obtient le même résultat en combinant un LEFT JOIN et un RIGHT JOIN avec UNION :
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
UNION
SELECT * FROM table1 RIGHT JOIN table2 ON table1.id = table2.id;
Imaginons que l'on fusionne les données de deux agences. L'agence A a sa propre liste de clients, l'agence B aussi. On veut une liste complète de tous les clients, montrant où ils se recoupent.
SELECT
a.customer_name AS branch_a_name,
b.customer_name AS branch_b_name
FROM
branch_a_customers AS a
FULL OUTER JOIN
branch_b_customers AS b ON a.customer_id = b.customer_id;