PostgreSQL FULL JOIN
O `FULL JOIN` no PostgreSQL combina os resultados do `LEFT JOIN` e do `RIGHT JOIN`. Ele retorna todos os registros quando há uma correspondência nos registros da tabela esquerda ou direita e preenche os `NULLs` quando não há correspondência.
Uso
O `FULL JOIN` é usado quando você deseja recuperar todos os registros de duas tabelas e incluir linhas sem correspondências diretas em nenhuma das tabelas. Isso é particularmente útil para conjuntos de dados com registros que podem não ter correspondências na outra tabela.
sql
SELECT columns
FROM table1
FULL JOIN table2 ON table1.common_column = table2.common_column;
Nessa sintaxe, `FULL JOIN` mescla as linhas de `table1` e `table2` com base em uma coluna compartilhada, incluindo as linhas não correspondentes de ambas as tabelas.
Exemplos
1. FULL JOIN básico
sql
SELECT *
FROM employees
FULL JOIN departments ON employees.dept_id = departments.id;
Este exemplo recupera todos os registros das tabelas `employees` e `departments`, combinando-os com `dept_id` e `id`, e preenche com `NULLs` as linhas não correspondentes.
2. Usando FULL JOIN com WHERE
sql
SELECT employees.name, departments.name
FROM employees
FULL JOIN departments ON employees.dept_id = departments.id
WHERE departments.name IS NOT NULL;
Essa consulta combina `FULL JOIN` com uma cláusula `WHERE` para filtrar os resultados em que o nome do departamento é `NULL`, mostrando como refinar os resultados após a união.
3. FULL JOIN com agregação
sql
SELECT employees.dept_id, COUNT(employees.id) AS employee_count, departments.name
FROM employees
FULL JOIN departments ON employees.dept_id = departments.id
GROUP BY employees.dept_id, departments.name;
Este exemplo usa `FULL JOIN` com `GROUP BY` para agregar dados, fornecendo uma contagem de funcionários por departamento, incluindo departamentos sem funcionários.
4. Manipulação de valores NULL
sql
SELECT COALESCE(employees.name, 'No Employee') AS employee_name,
COALESCE(departments.name, 'No Department') AS department_name
FROM employees
FULL JOIN departments ON employees.dept_id = departments.id;
Este exemplo demonstra como lidar com valores `NULL` usando `COALESCE` para fornecer valores padrão para linhas não correspondentes.
Comparação de tipos de JOIN
- LEFT JOIN: Retorna todos os registros da tabela da esquerda e os registros correspondentes da tabela da direita. Os registros não correspondentes da tabela correta são preenchidos com `NULL`.
- JUNÇÃO DIREITA: Retorna todos os registros da tabela da direita e os registros correspondentes da tabela da esquerda. Os registros não correspondentes da tabela da esquerda são preenchidos com `NULL`.
- JOIN COMPLETO: Retorna todos os registros de ambas as tabelas, preenchendo `NULL` para linhas não correspondentes de qualquer tabela.
Dicas e práticas recomendadas
- Use com cautela em conjuntos de dados grandes. O `FULL JOIN` pode produzir grandes conjuntos de resultados, portanto, certifique-se de que ele seja necessário para sua análise.
- Manipular valores `NULL`. Esteja preparado para gerenciar valores `NULL` em sua lógica, especialmente ao realizar cálculos ou filtrar resultados.
- Otimize com índices. Garanta a indexação adequada nas colunas de união para melhorar o desempenho.
- Combine com outros filtros. Use as cláusulas `WHERE` para filtrar ainda mais os resultados e reduzir o tamanho do conjunto de resultados.
- Teste em subconjuntos. Valide a lógica em amostras de dados menores antes de aplicar o `FULL JOIN` a tabelas inteiras.
- Considerações sobre o desempenho. Esteja ciente de que o `FULL JOIN` em tabelas muito grandes pode levar a um tempo de processamento e uso de recursos significativos.
- Considere alternativas. Em alguns casos, o uso de `LEFT JOIN` ou `RIGHT JOIN` pode ser mais apropriado, dependendo dos requisitos específicos de sua consulta.