Pular para o conteúdo principal

Treinamento para Consultas com SQL Server – Parte 2 - JOINS - LEFT JOINS



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

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.

Qual seria a solução, caso houvesse registros em SALES.SALESPERSON que não estivessem vinculados com EMPLOYEE? Fazer a junção desta com a tabela PERSON.PERSON, embora neste banco de dados não haverá registros com este relacionamento. O importante aqui é observar qual tabela deve ser usada no relacionamento para obter os dados corretos.

...
left join sales.SalesPerson sp on
sp.BusinessEntityID=p.BusinessEntityID
...
 

Até o próximo com a conclusão sobre JOINS. 

Postagens mais visitadas deste blog

Como gerar scripts para exportar dados no SQL Server 2008

Uma das tarefas mais comuns no trabalho com desenvolvimento de software que consome dados em bancos como o SQL Server 2008 é a necessidade de em algum momento precisarmos exportar os dados de um banco para outro. Quer seja para realizar testes ou fazer simulações existem várias maneiras de se fazer isto. Neste post eu quero demonstrar um recurso do SQL Server Management Studio (SSMS) que permite realizar esta tarefa rapidamente.Para os que estão acostumados a usar esta ferramenta, já devem saber que é possível gerar scripts para o schema e também transferir os dados entre dois bancos distintos. Isto pode ser feito se o SSMS puder conectar-se com as duas bases, de origem e destino. No exemplo que vou dar, o objetivo é gerar o script apenas para uma tabela do banco de dados de exemplo da Microsoft – Northwind.1. Iniciando o assistenteO assistente deve ser iniciado clicando com o botão direito do mouse sobre o banco onde se encontra a tabela a qual iremos gerar o script. Deve se clicar n…

Pivot dinâmico com SQL Server

Passo a passo para usar pivoteamento dinâmicoOs bancos de dados bem configurados e definidos armazenam os dados de forma a otimizar o acesso, evitando duplicidade e garantindo a integridade. Porém, em muitas situações isto pode dificultar a apresentação de forma adequada sendo necessário preparar os dados usando vários recursos entre os quais, fazer o pivoteamento.Se você não precisou ainda usar ou não sabe o que é consiste em transformar cada linha de uma determinada coluna em colunas de uma nova consulta.Assim, considere uma tabela que armazene as notas bimestrais de um boletim. Uma possível estrutura para esta tabela seria algo assim:ColunaTipo de dado/TamanhoDisciplinanvarchar(50)BimestreIntNotanumeric(5,2)Uma consulta select nesta tabela com alguns dados traria um resultado parecido com o abaixo:Porém pode ser que para apresentar estes dados em um relatório seja necessário transformar cada bimestre em uma coluna e agrupar as notas nestas colunas para que fique dessa forma:Isto po…

Desabilitando o auto commit no SSMS (SQL Server Management Studio)

(Ou, como prevenir desastres e manter o emprego a salvo…)Neste post vai uma pequena mas tremendamente útil dica para desabilitar o auto commit da aplicação SQL Server Management Studio (SSMS) que é usada por dez entre dez usuários do banco de dados SQL Server para fazer consultas, alterações e executar scripts no banco de dados. (Preferências à parte, realmente muita gente usa),A primeira e mais importante notícia é que, diferentemente da ferramenta do Oracle, este editor de scripts do SQL Server vem com o recurso de auto commit ativado por padrão, assim, qualquer instrução DML (alteração dos dados com update, insert e delete) ou DDL (alteração no banco como create, drop, alter, etc.) será imediatamente enviada ao banco e persistida.Isto pode ser altamente crítico pois se estiver executando as instruções em um banco de dados de produção não haverá muitas formas de desfazer se é que haverá.Inicialmente, pode se evitar muitos acidades executando estas instruções dentro de um bloco BEGIN…