O FULL OUTER JOIN é o tipo de junção mais inclusivo. Ele retorna todas as linhas quando há uma correspondência em qualquer uma das tabelas, esquerda ou direita. É essencialmente uma combinação de um LEFT JOIN e um RIGHT JOIN.
Um FULL OUTER JOIN cria um conjunto de resultados que inclui todos os registros de ambas as tabelas.
Visualização:
Tabela A (leads_potenciais) Tabela B (clientes_ativos)
+----+----------+ +----+----------+
| id | nome | | id | status |
+----+----------+ +----+----------+
| 1 | Alice | <--------> | 1 | Ativo | (Correspondência!)
| 2 | Bob | <--------? | NULL | (Apenas lead, sem conta ainda)
| NULL | <--------> | 3 | Ativo | (Apenas cliente, não está na lista de leads)
+----+----------+ +----+----------+
SELECT
table1.column1,
table2.column2
FROM
table1
FULL OUTER JOIN
table2 ON table1.common_column = table2.common_column;
Nota Importante sobre Suporte de Banco de Dados: Nem todos os sistemas de banco de dados suportam
FULL OUTER JOINnativamente.
- PostgreSQL, SQL Server e Oracle suportam.
- MySQL e MariaDB NÃO suportam.
Como o MySQL não possui FULL OUTER JOIN, os desenvolvedores obtêm o mesmo resultado combinando um LEFT JOIN e um RIGHT JOIN usando o operador UNION:
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
UNION
SELECT * FROM table1 RIGHT JOIN table2 ON table1.id = table2.id;
Imagine que estamos mesclando dados de duas filiais diferentes. A Filial A tem sua própria lista de clientes e a Filial B tem a dela. Queremos uma lista completa de todos os clientes em ambas as filiais, mostrando onde eles se sobrepõem.
SELECT
a.customer_name AS nome_filial_a,
b.customer_name AS nome_filial_b
FROM
branch_a_customers AS a
FULL OUTER JOIN
branch_b_customers AS b ON a.customer_id = b.customer_id;