Re: [firebase-br] É vantagem usar o Left Join neste casos ?
Henrique Netzka (Vetor Sistemas)
henrique em vetorsistemas.com.br
Qui Nov 9 12:27:03 -03 2006
Olá, Claudir...
Isso serve pra qualquer banco relacional, essa história de direita/esquerda.
É baseada - acho - na escrita ocidental: você sempre começa da esquerda e
vai indo pra direita.
O LEFT JOIN vai dizer para o SELECT que ele deve ter o sentido ESQUERDA, ou
seja, vai puxar da direita pra esquerda. Isso quer dizer que ele vai jogar
as duas tabelas, a principal à esquerda e a secundária à direita, e vai
puxar todos os registros correspondentes da DIREITA para ESQUERDA.
Exemplificando:
Duas tabelas,
EMPRESA
CodEmp | NomEmp
1 | MATRIZ
2 | FILIAL 1
3 | FILIAL 2
FUNCIONARIOS
CodFun | CodEmp | NomFun
1 | 1 | JOAO
2 | 1 | PEDRO
3 | 2 | ARIOVALDO
4 | 4 | JUCA
Considerando os resultados de três JOINS:
- Empresa LEFT JOIN Funcionarios ON Funcionarios.CodEmp = Empresa.CodEmp
- Ou seja, EMPRESA <- Funcionarios
- Ou seja, o registro na EMPRESA é obrigatório; na funcionários, não!
- Retornará TODAS as EMPRESAS com os funcionários que elas possuirem; ou
seja, retornará EMPRESAs 1, 2, 3 e FUNCIONARIOS 1, 2, 3 (note que o
funcionário 4 não tem uma empresa cadastrada; logo, neste caso não será
retornado)
- Empresa INNER JOIN Funcionarios ON Funcionarios.CodEmp = Empresa.CodEmp
- Ou seja, EMPRESA <- Funcionarios
- Ambos os lados obrigatórios
- Retornará EMPRESAS e FUNCIONARIOS que possuírem correspondências em
ambas as tabelas; no caso, EMPRESAs 1, 2 (pois a 3 não possui funcionários);
Funcionários 1, 2, 3
- Empresa RIGHT JOIN Funcionarios ON Funcionarios.CodEmp = Empresa.CodEmp
- Não faça isso, haha.. o desempenho é nojento
- Ou seja, EMPRESA -> Funcionarios
- Ou seja, registros na tabela Funcionários são obrigatórios; empresas,
não!
- Retornará TODOS os FUNCIONARIOs e suas empresas, quando existirem; no
caso, EMPRESAs 1, 2 e Funcionarios 1, 2, 3, 4.
- Tem o CROSS JOIN, mas nem vou entrar nos méritos...
Quando usado no WHERE, o JOIN implícito é do tipo INNER; ou seja, sempre
deverá haver correspondência. Receio que o Firebird não possua, mas outros
bancos como Informix possuem uma sintaxe para fazer OUTER joins usando a
sintaxe do WHERE.
Resumindo...
Se você tem uma cláusula FROM assim:
EMPRESA
LEFT JOIN Tab1 ON Tab1.CodEmp = Empresa.Codemp
LEFT JOIN TAb2 ON Tab2.Cod1 = Tab1.Cod1
Você terá as tabelas nesta ordem, Empresa <- Tab1 <- Tab2.
Outro detalhe importante: LEFT E RIGHT são OUTERs implícitos; ou seja, LEFT
OUTER JOIN e LEFT JOIN significam exatamente a mesma coisa...
O INNER também pode ser omitido, sendo que as três instruções abaixo são
IGUAIS:
FROM
EMPRESA
JOIN Funcionarios (...)
FROM
EMPRESA
INNER JOIN Funcionarios (...)
FROM
EMPRESA, Funcionarios
WHERE
(...)
Esclareceu um pouco?! Ou sua dúvida não tinha nada a ver com isso? rs
Henrique Netzka
----- Original Message -----
From: "Claudir Pereira dos Santos" <claupers_dbrays em yahoo.com.br>
To: <lista em firebase.com.br>
Sent: Thursday, November 09, 2006 10:43 AM
Subject: Re: [firebase-br] É vantagem usar o Left Join neste casos ?
> Desculpe a intromissão, mas como o firebird tem como saber se tabela esta
> a
> esquerda ou a direita? Ou melhor, o que define se uma tabela esta a
> esquerda
> ou a direita?
>
>
> Cordialmente;
>
>
> Claudir P. Santos
> T.I.
> ---------------------------------------------------------------------
>
> O LEFT torna explícito que a pesquisa deve ser realizada na tabela à
> direita, para cada registro da tabela à esquerda. Assim, se a tabela à
> direita tem um indíce adequado para a pesquisa, a performance fica
> melhor do que com amarrações na cláusula WHERE.
>
>
>> Vale sempre usar o PLAN, acho... Por ali se vê o que o otimizador está
>> fazendo certo e o que não está!
>
> Sim. O PLAN é um bom companheiro, o PLAN é um bom companheiro, ...
>
>
> Abraço!
> Jeferson Oliveira
>
>
>
>
>
>
--------------------------------------------------------------------------------
______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para editar sua configuração na lista, use o endereço
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa
Mais detalhes sobre a lista de discussão lista