Você está na página 1de 2

Pessoal, nesta semana vou falar sobre um assunto muito importante quando se trata de recuperar dados que esto

espalhados entre vrias


tabelas do banco de dados e se ligam de alguma maneira. Para a recuperao destes dados, precisamos utilizar um join.

Joins

So a maneira de se ligar as tabelas em uma instruo SQL.


Nos exemplos, vou me referir a utilizao de joins em instrues SELECT, mas a partir do SQL Server 2000 podemos utilizar os joins tanto nas
instrues SELECT como UPDATE e DELETE. Para os exemplos seguintes, criei trs tabelas, chamadas PEDIDO, CLIENTE e ITENSPEDIDO,
que reproduzem o clssico relacionamento pai-filho:

CREATE
TABLE PEDIDO
(
PED_COD INT NOT NULL,
PED_DATA SMALLDATETIME NOT NULL ,
PED_CLI INT NOT NULL
)
CREATE TABLE CLIENTE
(
CLI_COD INT NOT NULL,
CLI_NOME VARCHAR(50) NOT NULL
)
CREATE TABLE ITENSPEDIDO
(
PED_COD INT NOT NULL,
ITEN_COD INT NOT NULL,
ITEN_QTD NUMERIC(5,2) NOT NULL
)

A tabela PEDIDO possui uma relao de um-para-muitos com a tabela ITENSPEDIDO, atravs do campo PED_COD. A tabela PEDIDO possui
uma relao de um-para-um com a tabela CLIENTE, atravs do campo CLI_COD.
Percebam que neste exemplo no estou utilizando contraints declarativas de integridade referencial (DRI) como chaves primrias ou chaves
estrangeiras, pois quis montar um exemplo simples.
Tambm no me preocupei com cardinalidade da relao e normalizao do modelo.
Antes de continuar, aconselho ao leitor incluir alguns registros nestas tabelas para tornar os exemplos a seguir mais compreensveis.
Agora vamos ver os trs tipos bsicos de joins e como implement-los:

1. Inner Join

O Inner Join, que geralmente a maneira mais utilizada de se retornar dados espalhados entre tabelas, funciona seguindo o princpio de que para
os registros retornados de uma tabela, deve haver algum tipo de relao com os registros da outra tabela. No caso da igualdade, somente os
registros das duas tabelas, que possurem o mesmo valor para um determinado campo, so retornados. Um exemplo:

SELECT
PED.PED_COD ,
PED. PED_DATA ,
ITEN. ITEN_COD ,
ITEN. ITEN_QTD
FROM PEDIDO PED , ITENSPEDIDO ITEN
WHERE
PED.PED_COD = ITEN.PED_COD

Percebam no exemplo acima que somente os registros que contiverem o mesmo valor para o campo PED_COD nas duas tabelas so retornados.
Apesar de existir outra maneira de se fazer o INNER JOIN, eu recomendo a maneira com o WHERE, pois torna o cdigo da instruo mais legvel.
Em termos de performance, as duas instrues se equivalem. Outra maneira, que retorna os mesmos resultados:

SELECT
PED.PED_COD ,
PED. PED_DATA ,
ITEN. ITEN_COD ,
ITEN. ITEN_QTD
FROM PEDIDO PED INNER JOIN ITENSPEDIDO ITEN
ON PED.PED_COD = ITEN.PED_COD

importante lembrar tambm que o Inner join permite o uso de outros operadores que no sejam somente o igual (=).

2 Outer join
.

O tipo de join chamado Outer join, possui o funcionamento um pouco diferente. Utilizando o Outer join, alm de podermos retornar os registros
das duas tabelas seguindo alguma relao, ainda podemos retornar registros que no entram nesta relao.

Geralmente, este tipo de join pode ser utilizado em duas tabelas. Mas nada impede que se utilize em mais de duas tabelas, como a tabela de
cliente ao nosso modelo PEDIDO-ITENS por exemplo.
Pensando na ligao entre duas tabela, foram criados duas opes para se utilizar no Outer Join:
*
Opo LEFT OUTER JOIN, visando aplicar o conceito de Outer Join na tabela que se encontrar esquerda da relao.
Apesar de no ser recomendado, pode ser substituda pelo operador
*=
*
Opo RIGHT OUTER JOIN, visando aplicar o conceito de Outer Join na tabela que se encontrar direita da relao.
Apesar de no ser recomendado, pode ser substituda pelo operador =*
Como podemos alterar a ordem na qual colocamos a tabela na instruo, h um equivalncia em termos de funcionalidade para estas opes de
Outer Join. Importante: esta ordem em relao s tabelas, e no comparao feita aps a palavra chave ON.
Por exemplo, queremos todos os pedidos que tenham relao com a tabela de itens e tambm os pedidos que no tenham relao com nenhum
item:

SELECT
PED.PED_COD ,
PED. PED_DATA ,
ITEN. ITEN_COD ,
ITEN. ITEN_QTD
FROM PEDIDO PED LEFT OUTER JOIN ITENSPEDIDO ITEN
ON PED.PED_COD = ITEN.PED_COD

Pode ser escrita como:

SELECT
PED.PED_COD ,
PED. PED_DATA ,
ITEN. ITEN_COD ,
ITEN. ITEN_QTD
FROM ITENSPEDIDO ITEN RIGHT OUTER JOIN PEDIDO PED
ON PED.PED_COD = ITEN.PED_COD

Ou ainda:

SELECT
PED.PED_COD ,
PED. PED_DATA ,
ITEN. ITEN_COD ,
ITEN. ITEN_QTD
FROM ITENSPEDIDO ITEN , PEDIDO PED
WHERE PED.PED_COD *= ITEN.PED_COD

Vejam que para os registros em que a relao de igualdade foi encontrada,


os campos de ambas as tabelas so retornados corretamente. Nos registros em que nenhum item de pedido foi encontrado, colocado o valor
NULL para todos os campos da tabela ITENSPEDIDO.

3 Cross Join
.

O Cross Join possui uma funcionalidade completamente diferente dos outros tipos de Join. Ele simplesmente obtm todos os registros de todas
as tabelas e faz o produto cartesiano (ou seja, cada registro de uma tabela relacionado com cada registro da outra tabela), obtendo assim, o
nmero total de registros atravs da multiplicao do total de registros das tabelas envolvidas no Cross Join.

Por exemplo:

SELECT
PED.PED_COD ,
PED. PED_DATA ,
CLI.CLI_COD,
CLI.CLI_NOME
FROM PEDIDO PED , CLIENTE CLI

Percebam que no exemplo acima, todos os pedidos se relacionaro com todos os clientes, independendo do valor dos campos CLI_COD e
PED_CLI.
Este tipo de Join poderia ser escrito e fazer dois Outer Join, que neste caso seria chamado de Full Outer Join. A partir da verso 2000 do SQL
Server, no mais podemos utilizar o operador *=* para fazer Cross Join, pois este operador foi extinto.
Muitos problemas de query (como registros retornados a mais, ou duplicados, ou mesmo no atendendo o critrio) ocorrem pelo mal-uso de Joins.
Para isso, temos uma pequena regra: SEMPRE que utilizarmos uma tabela na clusula FROM de uma instruo SELECT, devemos
obrigatoriamente fazer um join com alguma outra tabela que tambm est na clusula FROM da instruo. Se simplesmente colocarmos a tabela
na clusula FROM e no fizermos nenhum join com ela, o SQL Server automaticamente ir fazer um Cross Join com as demais tabelas d a
instruo .