Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
JOIN's (Junções) no SQL Server, são permitidas nas claúsulas FROM e WHERE, é recomendado o uso na cláusula FROM por questões de performance e melhor organização do código.
vejamos um simples exemplo de join com inner, left, right e full:
Dados para os Testes:
declare @table1 table (cod char(1)) declare @table2 table (cod char(1)) insert into @table1 (cod) values ('A') insert into @table2 (cod) values ('B') insert into @table1 (cod) values ('B') insert into @table2 (cod) values ('C')Select da tabela 1 e tabela 2:
print 'TABELA 1' select * from @table1 print 'TABELA 2' select * from @table2resultado:
>
TABELA 1
cod
----
A
B
(2 row(s) affected)
TABELA 2
cod
----
B
C
(2 row(s) affected)
IMPORTANTE: Observer que o código "B" aparece nas tuas tabelas, o código "A" somente na tabela 1 e o código "C" somente na tabela 2
Junções na cláusula FROM:
print 'INNER JOIN --> somente mostra o que esta na table1 e table2 com a mesma chave' select * from @table1 t1 inner join @table2 t2 on t1.cod = t2.codretorna:
>
cod cod
---- ----
B B
(1 row(s) affected)
print 'LEFT JOIN --> mostra o que esta na table1 e table2 com a mesma chave e tudo o que esta somente na table1' select * from @table1 t1 left join @table2 t2 on t1.cod = t2.codretorna:
>
cod cod
---- ----
A NULL
B B
(2 row(s) affected)
print 'RIGHT JOIN --> mostra o que esta na table1 e table2 com a mesma chave e tudo o que esta somente na table2' select * from @table1 t1 right join @table2 t2 on t1.cod = t2.codretorna:
>
cod cod
---- ----
B B
NULL C
(2 row(s) affected)
print 'FULL JOIN --> mostra os dados das duas tabelas table1 e table2' select * from @table1 t1 full join @table2 t2 on t1.cod = t2.codretorna:
>
cod cod
---- ----
B B
NULL C
A NULL
(3 row(s) affected)
junções na cláusula WHERE:
print 'INNER JOIN = --> somente mostra o que esta na table1 e table2 com a mesma chave' select * from @table1 t1, @table2 t2 where t1.cod = t2.codretorna:
>
cod cod
---- ----
B B
(1 row(s) affected)
print 'LEFT JOIN = --> mostra o que esta na table1 e table2 com a mesma chave e tudo o que esta somente na table1' select from @table1 t1, @table2 t2 where t1.cod *= t2.codretorna:
>
cod cod
---- ----
A NULL
B B
(2 row(s) affected)
print 'RIGHT JOIN = --> mostra o que esta na table1 e table2 com a mesma chave e tudo o que esta somente na table2' select from @table1 t1, @table2 t2 where t1.cod =* t2.codretorna:
>
cod cod
---- ----
B B
NULL C
(2 row(s) affected)
AUTOR: "eriva_br"
Dúvidas, criticas, contribuições, correções e adições seram bem vindas.
Vamos lah, como postei em outro forum:
"
opa opa.. salve ^^
votei no FROM
=)
Seguinte..
Em questao de performance q é o que mais pega para os DBAs.
A sintaxe JOIN utilizada no FROM, tem uma pequena vantagem em relação ao WHERE, devido ao sistema de alocação de dados (gravação no .LOG) do SQL
Claro que com o where o código fica bem mais limpo, mas dependendo da "qtde" de joins, tabelas, views, sps a performance conta muito, principamente em aplicações criticas [a minha é :( ] sou obrigado a usar o from ^^
abs galera
"
;)
Pessoal, fiquei com dúvida em relação ao seguinte:
'INNER JOIN --> somente mostra o que esta na table1 e table2 com a mesma chave' select from @table1 t1 inner join @table2 t2 on t1.cod = t2.cod 'FULL JOIN --> mostra os dados das duas tabelas table1 e table2' select from @table1 t1 full join @table2 t2 on t1.cod = t2.cod
A descrição, comenta que os dados retornam das duas tabelas.
A minha dúvida é, o FULL JOIN retorna dados, que tenham a mesma chave??
A minha dúvida é, o FULL JOIN retorna dados, que tenham a mesma chave??
o full join retorna todos os dados mesmo que não tenham as mesmas chaves, agora coloquei o resultado logo abaixo da execução, qq. coisa abra o query analyser e faça os testest+
Fala gde eriva_br!
Bom votei no WHERE pq aqui onde trabalho o pessoa do AD só aceita desta forma. Acho que qdo começaram a desenvolver fizeram no WHERE e ficou com padrão. Por isso acabo fazendo no WHERE pq se fizer no FROM qdo for para produção tenho de mudar.
Eu prefiro no FROM pois como já discutimos antes por questões de organização, performance e facilitar a manutenção. E claro os acadêmicos adoram.
Só uma ressalva. Se o desenvolvedor for desleixado msm no FROM o JOIN fica complicado. Por isso no seja no FROM seja no WHERE comente e seja organizado.
Agora conheci um DBA que trabalhava comigo (o bixo tinha mestrado, doutorado e era certificado) tirava a maior onda dizia que não gastou dinheiro estudando para utilizar JOIN em WHERE. Bom despois descobri que qdo ele tinha que criar um JOIN no FROM ele criava as tabelas no Access e gerava na grede QBE via o assitente. http://forum.imasters.com.br/public/style_emoticons/default/yay.gif Ai fica fácil!
Bom seja qual for a opção escolhida utilize a que você achar mais confortável e lembre-se de tentar criar expressões robustas, documentadas e exutas.
t+