04/10/2004

Diferenças entre Left Join e *=

Boa tarde,

Gostaria de saber a difernça entre o left join e o *=, pois estou encontrando diferença nos resultados de um e de outro. Por exemplo:

create table #teste (codigo int, nome varchar(50), saldo float)
create table teste1 (codigo int, nome varchar(50), saldo float)
insert teste values (1, ´a´, 10)
insert teste values (2, ´b´, 6)
insert teste values (3, ´c´, 7)
insert teste values (4, ´d´, 8)
insert teste1 values (3, ´c´, 5)
insert teste1 values (4, ´d´, 13)

select a.codigo,
case when (a.saldo-b.saldo) is null then 0 else (a.saldo-b.saldo) end
from teste a, teste1 b
where a.saldo-b.saldo 0
and a.codigo *= b.codigo

resultado:
=======

codigo
--------- --------
1 0.0
2 0.0
3 2.0
4 -5.0

(4 row(s) affected)


***************
select a.codigo,
case when (a.saldo-b.saldo) is null then 0 else (a.saldo-b.saldo) end
from #teste a
left outer join teste1 b on a.codigo = b.codigo
where a.saldo-b.saldo 0

resultado:
=======

codigo
--------- --------
3 2.0
4 -5.0

(2 row(s) affected)


Neste exemplo não deveria aparecer todas as 4 linhas da primeira tabela? Onde está meu erro?

Att,
Roberto


Robertolucio

Respostas

04/10/2004

Robertolucio

Em tempo,

Sei que se eu retirar a cláusula where do exemplo com left join irão aparacer as 4 linhas, mas porque não é necessário retirar a mesma (a.codigo-b.codigo0) do outro exemplo?


Responder Citar

04/10/2004

Marcus.magalhaes

Boa noite Justino.

Vc não cometeu erro nos seus select, o problema é que existe uma falha na linguagem sql quando não se usa o [color=green:96948d649c]padrão ANSI[/color:96948d649c], que é [color=red:96948d649c]LEFT JOIN, RIGHT JOIN ou FULL OUTER JOIN[/color:96948d649c], devido à essa falha, que ocorre tb em outras circunstâncias, a própria MS anunciou que em versões futuras do MS SQL Server, será suportado somente o padrão ANSI. Além disso ele é muito mais claro para se escrever e ler.

Portanto procure utilizar sempre o padrão.

Espero ter ajudado.

Att,


Responder Citar

05/10/2004

Marceloeugenio

Marcus,

Onde você encontrou informações dizendo que existem falhas quando utilizamos ´=´ ao invés de JOIN´s (LEFT, RIGHT e etc.) ?

Há muito tempo estou procurando informações sobre este assunto, do tipo :

Possíveis Falhas;
Versão que não irão comportar o uso de ´=´, ´*=´ e ´=*´;
Documentação da Microsoft com estas informações.

Por favor, caso você saiba onde eu posso encontrar tais informações, me avise por favor !

Muito Obrigado !


Responder Citar

05/10/2004

Marcus.magalhaes

Boa noite Marcelo.

Esta informação está no BOL do SQL Server.

escolha a tab Index e digite : [color=red:3bb4481f0a]joins-SQL Server[/color:3bb4481f0a], depois selecione o item [color=red:3bb4481f0a]operators[/color:3bb4481f0a].

Lá está o que eu estou falando.

Att,


Responder Citar

06/10/2004

Marcus.magalhaes

ah...bom dia.

A propósito, a diferença entre LEFT JOIN e *= esta na forma de processamento.

Quando um select é processado, ele é dividido em vários passos, onde o LEFT JOIN e a clausula ON são processados antes da clausula WHERE, enquanto no *= os dados são filtrados somente no WHERE, obtendo desta forma um resultado diferente em alguns casos. Por isso a MS passou a seguir o padrão ANSI-SQL 92 e somente aceita a forma não padrão (*=) para fins de compatibilidade.

Att,


Responder Citar