Usar auto-associações
Até agora, as junções que usamos envolveram diferentes tabelas. Pode haver cenários em que você precise recuperar e comparar linhas de uma tabela com outras linhas da mesma tabela. Por exemplo, em um aplicativo de recursos humanos, uma tabela Employee pode incluir informações sobre o gerente de cada funcionário e armazenar o ID do gerente na própria linha do funcionário. Cada gerente também é listado como um funcionário.
EmployeeID
FirstName
ID do Gerente
1
Danilo
NULL
2
Aisha
1
3
Rosie
1
4
Noemi
3
Para recuperar as informações do funcionário e combiná-las com o gerente relacionado, você pode usar a tabela duas vezes em sua consulta, unindo-a a si mesma para os fins da consulta.
SELECT emp.FirstName AS Employee,
mgr.FirstName AS Manager
FROM HR.Employee AS emp
LEFT OUTER JOIN HR.Employee AS mgr
ON emp.ManagerID = mgr.EmployeeID;
Os resultados dessa consulta incluem uma linha para cada funcionário com o nome de seu gerente. O CEO da empresa não tem gerente. Para incluir o CEO nos resultados, uma junção externa é usada e o nome do gerente é retornado como NULL para linhas em que o campo ManagerID não tem campo EmployeeID correspondente.
Colaborador
Gestor
Danilo
NULL
Aisha
Danilo
Rosie
Danilo
Noemi
Rosie
Há outros cenários em que você vai querer comparar linhas em uma tabela com linhas diferentes na mesma tabela. Como você viu, é bastante fácil comparar colunas na mesma linha usando T-SQL, mas o método para comparar valores de linhas diferentes (como uma linha que armazena uma hora de início e outra linha na mesma tabela que armazena um tempo de parada correspondente) é menos óbvio. As auto-junções são uma técnica útil para esses tipos de consultas.
Para realizar tarefas como esta, você deve considerar as seguintes diretrizes:
- Defina duas instâncias da mesma tabela na cláusula FROM e junte-as conforme necessário, usando junções internas ou externas.
- Use aliases de tabela para diferenciar as duas instâncias da mesma tabela.
- Use a cláusula ON para fornecer um filtro comparando colunas de uma instância da tabela com colunas da outra instância da tabela.