Upload
internet
View
103
Download
0
Embed Size (px)
Citation preview
Elaboração de ConsultaContinuação
7/abril/2006
Modelo
Auto- junção
• Seja a tabela Cliente
Auto-junção
• O código do cliente-indicador é o código do cliente que indicou aquela empresa.
Ex. MACDONALDS foi indicada pela Brastemp,
BOBS pela Embraco, etc.
A EMBRACO e BRASTEMP não foram indicadas por ninguém ( cd_cliente_indicador is null )
Auto-junção
• O usuário solicitou um relatório de nome dos clientes e de seus respectivos indicadores
Cd_cliente, nm_cliente, cd_cliente_indicador
1, Brastemp, null,2, Embraco, null3, Mcdonalds, 1
4, Bobs, 25, Grendelli, 3
6, Jo Calcados, 4
Auto-junção
• Ou self join
• É usada para efetuar junção de uma tabela a si mesma, como se fosse duas tabelas, renomeando temporariamente , ao menos, uma tabela na instrução SQL
Auto- junção
SELECT A.nm_cliente as INDICADO , I.nm_cliente as INDICADOR
FROM
CLIENTE A inner join CLIENTE I
ON ( I.cd_cliente = A.cd_cliente_indicador)
Auto-junção
Note os apelidos dados aos campos de saída
JOIN ... ON/USING...CLIENTE CONTATO
1 , Maria
2 , Joelma
3 , Carlos
4 , Andre
Cd-cliente, cd-contato, nm_contatoCd-cliente, nm_cliente
1 , 1, Aldeny
1, 2, Jose
3, 1, Antonio
3, 2, Ildefonso
Maria, Aldeny
Maria, Jose
Carlos, Antonio
Carlos, Ildefonso
SELECT nm_cliente, nm_contato FROM cliente
INNER JOIN contato USING(cd_cliente)
Junção Externa
• OUTER JOIN• É empregada quando há necessidade de
forçar nulos para aparecimento de alguns valores sem correspondência em uma das tabelas
• Três variações:– LEFT OUTER JOIN– RIGHT OUTER JOIN– FULL OUTER JOIN
JOIN ... ON/USING...CLIENTE CONTATO
1 , Maria
2 , Joelma
3 , Carlos
4 , Andre
Cd-cliente, cd-contato, nm_contatoCd-cliente, nm_cliente
1 , 1, Aldeny
1, 2, Jose
3, 1, Antonio
3, 2, Ildefonso
Maria, Aldeny
Maria, Jose
Carlos, Antonio
Carlos, Ildefonso
Joelma, (null)
Andre, (null)
Listar todos os nomes de clientes e nomes de contatos, quem não tiver contato, deve aparecer !!!
• Por que LEFT ?
• Sintaxe– SELECT ... FROM tab1 LEFT [OUTER] JOIN
tab2 ON ( tab1.cd = tab2.o_cd)
• JOIN : Trabalha-se as tabelas de 2 a 2
LEFT [OUTER] JOIN
– SELECT ...
FROM tab1 LEFT [OUTER] JOIN tab2
ON ( tab1.cd = tab2.o_cd)
• Recuperar todos dados da 1ª tabela
(que precede o JOIN: tab1 ) mesmo que o dado de tab1 não tenha correspondência em tab2 : um nulo será forçado.
Ex. JOELMA (cliente) => ? (contato)
LEFT [OUTER] JOIN
CLIENTE CONTATO
1 , Maria
2 , Joelma
3 , Carlos
4 , Andre
Cd-cliente, cd-contato, nm_contatoCd-cliente, nm_cliente
1 , 1, Aldeny
1, 2, Jose
3, 1, Antonio
3, 2, Ildefonso
Maria, Aldeny
Maria, Jose
Carlos, Antonio
Carlos, Ildefonso
Joelma,
Andre,
SELECT nm_cliente, nm_contato FROM cliente
LEFT [OUTER] JOIN contato USING(cd_cliente)
LEFT [OUTER] JOIN
• Por que RIGHT ?
• SintaxeSELECT ... FROM tab1 RIGHT [OUTER] JOIN
tab2 ON ( tab1.cd = tab2.o_cd)
• Quando se deseja recuperar os todos dados da 2ª tabela ( que precede o JOIN) mesmo os dados de tab2 não tenham correspondência em tab1
RIGHT [OUTER] JOIN
CLIENTECONTATO
1 , Maria
2 , Joelma
3 , Carlos
4 , Andre
Cd-cliente, cd-contato, nm_contatoCd-cliente, nm_cliente
1 , 1, Aldeny
1, 2, Jose
3, 1, Antonio
3, 2, Ildefonso
Maria, Aldeny
Maria, Jose
Carlos, Antonio
Carlos, Ildefonso
Joelma,
Andre,
SELECT nm_cliente, nm_contato FROM contato
RIGHT [OUTER] JOIN cliente USING(cd_cliente)
RIGHT [OUTER] JOIN
auto junção com junção externa
• Liste todos os clientes e seus respectivos indicadores...
• Os clientes que não tem indicadores também devem aparecer ...
FULL OUTER JOIN
• Recuperação de valores dos dois lados ( duas tabelas) sem descartar as não -correspondências
JOIN• Caso 1: cd_aluno,
matricula têm mesmo domínio de valores
SELECT nm_aluno
FROM
aluno a INNER JOIN func f
ON a.cd_aluno = f.matricula
Apenas
- José
- André
01343, Maria01445, José04556, Carlos05300,Serafim20030, Jorge23922,Luiza25678, Valdir35876, André
30134, Ariane01445, José34056, Henri33420,Castro32310, Joao33222,Lair31228, Adir35976, André34584, Lea
Cd_aluno, nm_alunomatricula, nm_func
Aluno Func
JOIN
Select nm_aluno, nm_funcionario FROM
Aluno a LEFT JOIN Func f
ON a.cd_aluno = f.matricula
Maria,
José, José
Carlos,
Serafim,
Jorge,
Luiza,
Valdir,
André, André
01343, Maria01445, José04556, Carlos05300,Serafim20030, Jorge23922,Luiza25678, Valdir35876, André
30134, Ariane01445, José34056, Henri33420,Castro32310, Joao33222,Lair31228, Adir35976, André34584, Lea
Cd_aluno, nm_alunomatricula, nm_func
Aluno Func
FULL OUTER JOINSelect nm_aluno, nm_funcionario FROMAluno a FULL JOIN Func fON a.cd_aluno = f.matriculaMaria, José, JoséCarlos, Serafim, Jorge, Luiza,Valdir,André, André, , Ariane , Henri , Castro , Joao , Lair , Adir , Lea
01343, Maria01445, José04556, Carlos05300,Serafim20030, Jorge23922,Luiza25678, Valdir35876, André
30134, Ariane01445, José34056, Henri33420,Castro32310, Joao33222,Lair31228, Adir35976, André34584, Lea
Cd_aluno, nm_aluno
matricula, nm_func
Aluno Func