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