quarta-feira, 14 de novembro de 2012

Sql Server JOINs - INNER JOIN- Parte 1

Em banco de dados normalizados, as informações necessárias para um único conjunto de dados podem estar localizadas em mais de uma tabela. Para suprir essa necessidade, utilizamos o operador JOIN.
Existem vários tipos de operadores JOINs, cada um com seu propósito dentro desse contexto de junção de tabelas. Os operadores são:

INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER, e CROSS.

Neste post vamos falar especificamente do operador INNER. Quando desejamos fazer junções entre tabelas, precisamos definir as tabelas que serão relacionadas, o tipo de operador JOIN que será utilizado e o padrão que será utilizado para retonar os registros das tabelas. No exemplo abaixo (executado no banco Adventure Works) as tabelas são: "HumanResources.Employee" e "Person.Person", o operador é "INNER JOIN" e a condição ou padrão é "HumanResources.Employee.BusinessEntityID = Person.Person.BusinessEntityID"

SELECT FirstName,LastName,JobTitle,VacationHours,SickLeaveHours
FROM HumanResources.Employee 
INNER JOIN Person.Person
ON HumanResources.Employee.BusinessEntityID = Person.Person.BusinessEntityID;

Quando não especificamos o tipo de JOIN (FROM HumanResources.Employee
JOIN Person.Person) o Sql Server adota o INNER JOIN como padrão.
Na clausula da condição estamos especificando o nome completo (schema.tabela.coluna) da coluna para evitar ambiguidade, visto que possuem o mesmo nome e estão em ambas as tabelas.

Mas qual a definição do INNER JOIN? Basicamente ele retorna os registros das tabelas especificadas que satisfação a condição. Só serão retornados os registros da tabela Employee que tenha o valor do seu campo BusinessEntityID referênciado na tabela Person no campo BusinessEntityID. Execute a query acima e veja o resultado. O registro de Employee que não tiver nenhuma referência em Person não será retornado e vice-versa.

No exemplo acima o SELECT possui apenas 2 tabelas, porem o INNER JOIN pode ser utilizado N vezes seguindo a regra descrita acima. Na condição do INNER JOIN utilizamos os campos que representam a chave primária e estrangeira das tabelas de modo a garantir a integridade referencial dos dados. Alem disso a condição especificada possui apenas uma regra mas pode existir N regras também, vejamos o exemplo abaixo:


SELECT FirstName,LastName,JobTitle,VacationHours,SickLeaveHours
FROM HumanResources.Employee E
INNER JOIN Person.Person P ON E.BusinessEntityID = P.BusinessEntityID and VacationHours > 30
INNER JOIN HumanResources.EmployeeDepartmentHistory EH ON EH.BusinessEntityID = E.BusinessEntityID;


Versão do Sql Server utilizada:
Microsoft SQL Server 2008 (SP3) - 10.0.5512.0

Nenhum comentário:

Postar um comentário