Neste tipo de relacionamento e junção de tabelas, os registros da tabela origem (LEFT) são listados independentemente de haverem registros na tabela filha (à direita).
Considere o exemplo das tabelas PERSON.PERSON e HUMANRESOURCES.EMPLOYEE deste post anterior, na primeira consulta, somente foram exibidos registros da primeira tabela caso fossem encontrados registros na segunda, com LEFT JOIN todos os registros da primeira são exibidos mesmo que não haja registros correspondentes nas tabelas relacionadas. Se for definido na cláusula SELECT mostrar colunas da segunda tabela, os valores serão NULL para quando não houver nenhuma correspondência. A consulta fica da seguinte forma:
select pp.FirstName + ' ' + pp.LastName as CompleteName
,HRE.JobTitle
,HRE.BirthDate
from person.person as pp
left join HumanResources.Employee HRE on hre.BusinessEntityID =
pp.BusinessEntityID
Esta consulta produz os seguintes resultados:
Desta vez um número maior de registros foi recuperado –
19972 ao todo – que é o número total de registros da tabela PERSON.
LEFT JOIN não pode ser usado para fazer filtros na tabela
principal como em INNER JOIN.
Também deve se tomar cuidado ao realizar os
relacionamentos porque, se por acaso precisarmos colocar relacionamentos com a
tabela relacionada com a cláusula LEFT, só serão exibidos registros da terceira, quarta, enésima, se
houver na tabela de origem. Considere o seguinte diagrama:
A tabela SALES.SALESPERSON faz parte do esquema SALES (vendas) e armazena indicadores para as vendas por empregados. Os campos que estamos interessados nesta tabela são:
- BusinessEntityID: id do empregado, ao mesmo tempo chave primária e estrangeira da tabela. Este campo é quem faz o relacionamento com a tabela HUMANRESOURCES.EMPLOYEE.
- SalesQuota: campo no formato MONEY (dinheiro) que armazena a quota de vendas do empregado.
- SalesLastYear: soma em dinheiro das vendas do último ano
- ModifiedDate: data da última vez que o registro foi alterado.
Com estas tabelas deseja-se obter as colunas acima para os empregados, assim a consulta, usando LEFT JOIN ficada seguinte forma:
select p.FirstName+ ' ' + p.LastName as CompleteName
,hre.JobTitle
,sp.SalesQuota
,sp.SalesLastYear
,sp.ModifiedDate
from Person.person p
left join HumanResources.Employee hre on
hre.BusinessEntityID=p.BusinessEntityID
left join sales.SalesPerson sp on
sp.BusinessEntityID=hre.BusinessEntityID
order by sp.SalesLastYear desc
select p.FirstName+ ' ' + p.LastName as CompleteName
,hre.JobTitle
,sp.SalesQuota
,sp.SalesLastYear
,sp.ModifiedDate
from Person.person p
left join HumanResources.Employee hre on
hre.BusinessEntityID=p.BusinessEntityID
left join sales.SalesPerson sp on
sp.BusinessEntityID=hre.BusinessEntityID
order by sp.SalesLastYear desc
E os resultados são exibidos abaixo:
Novamente todos os registros na tabela PERSON.PERSON são
recuperados e, quando não há registros em HUMANRESOURCES.EMPLOYEE, nenhum
registro na tabela SALES.SALESPERSON é listado.
...
left join sales.SalesPerson sp on
sp.BusinessEntityID=p.BusinessEntityID
...
Até o próximo com a conclusão sobre JOINS.