Elaboração de Consulta
Continuaçã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, null
3, Mcdonalds, 1
4, Bobs, 2
5, 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
Cd-cliente, nm_cliente
CONTATO
Cd-cliente, cd-contato, nm_contato
1 , Maria
1 , 1, Aldeny
Maria, Aldeny
2 , Joelma
1, 2, Jose
Maria, Jose
3 , Carlos
3, 1, Antonio
Carlos, Antonio
Carlos, Ildefonso
4 , Andre
3, 2, 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
Cd-cliente, nm_cliente
1 , Maria
CONTATO
Cd-cliente, cd-contato, nm_contato Maria, Aldeny
1 , 1, Aldeny
Maria, Jose
Carlos, Antonio
2 , Joelma
1, 2, Jose
3 , Carlos
3, 1, Antonio
Joelma, (null)
4 , Andre
3, 2, Ildefonso
Andre, (null)
Carlos, Ildefonso
Listar todos os nomes de clientes e nomes de contatos, quem não
tiver contato, deve aparecer !!!
LEFT [OUTER] JOIN
• 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
Cd-cliente, nm_cliente
CONTATO
Cd-cliente, cd-contato, nm_contato
Maria, Aldeny
1 , Maria
1 , 1, Aldeny
2 , Joelma
1, 2, Jose
Carlos, Antonio
3 , Carlos
3, 1, Antonio
Carlos, Ildefonso
4 , Andre
3, 2, Ildefonso
Joelma,
Maria, Jose
Andre,
SELECT nm_cliente, nm_contato FROM cliente
LEFT [OUTER] JOIN contato USING(cd_cliente)
RIGHT [OUTER] JOIN
• Por que RIGHT ?
• Sintaxe
SELECT ... 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
CONTATO
Cd-cliente, nm_cliente
CLIENTE
Cd-cliente, cd-contato, nm_contato
Maria, Aldeny
1 , 1, Aldeny
1 , Maria
Maria, Jose
1, 2, Jose
2 , Joelma
Carlos, Antonio
3, 1, Antonio
3 , Carlos
Carlos, Ildefonso
4 , Andre
Joelma,
3, 2, Ildefonso
Andre,
SELECT nm_cliente, nm_contato FROM contato
RIGHT [OUTER] JOIN cliente USING(cd_cliente)
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
Cd_aluno, nm_aluno
01343, Maria
01445, José
04556, Carlos
05300,Serafim
20030, Jorge
23922,Luiza
25678, Valdir
35876, André
Aluno
JOIN
matricula, nm_func
30134, Ariane
01445, José
34056, Henri
33420,Castro
32310, Joao
33222,Lair
31228, Adir
35976, André
34584, Lea
Func
• 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é
Cd_aluno, nm_aluno
01343, Maria
01445, José
04556, Carlos
05300,Serafim
20030, Jorge
23922,Luiza
25678, Valdir
35876, André
Aluno
JOIN
matricula, nm_func
30134, Ariane
01445, José
34056, Henri
33420,Castro
32310, Joao
33222,Lair
31228, Adir
35976, André
34584, Lea
Func
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é
FULL OUTER JOIN
Cd_aluno, nm_aluno
Select nm_aluno, nm_funcionario FROM
matricula, nm_func Aluno a FULL JOIN Func f
ON a.cd_aluno = f.matricula
Maria,
01343, Maria 30134, Ariane
José, José
Carlos,
01445, José
01445, José
Serafim,
04556, Carlos 34056, Henri
Jorge,
05300,Serafim 33420,Castro
Luiza,
20030, Jorge 32310, Joao
Valdir,
23922,Luiza
33222,Lair
André, André,
25678, Valdir 31228, Adir
, Ariane
35876, André 35976, André
, Henri
, Castro
34584, Lea
, Joao
, Lair
, Adir
, Lea
Aluno
Func
Download

transparências de apoio