Joins - Padrão ANSI SQL 
Autor: George Hilton Frey | Publicado: 2014-05-02T18:24:00-07:00

Trabalhei com um sistema feito na época do Sql Server 2000, ele tem muitas consultas utilizando comandos como *= e =*.

Até a versão Sql Server 2008 R2, pelo menos em teoria, isso não era problema, pois bastava alterar o nível de compatibilidade do banco de dados para o nível 80 por meio do comando:
sp_dbcmptlevel 'Nome da Base de dados', 80 e estava tudo bem, o sistema e o banco se comunicavam tranquilamente!

Aí a Microsoft resolveu descontinuar alguns comandos no Sql Server 2012, e para minha infelicidade esses os comandos citados acima estão no bolo. O nível de compatibilidade mínima do Sql Server 2012 é o 90 que é compatível com o Sql Server 2005.

Para resolver esse problema a solução foi varrer o código fonte do sistema e sair alterando todos os relacionamentos para o padrão ANSI SQL.

Como eu precisei estudá-los porque não lembrava mais a sintaxe, eu vou compartilhar aqui um resumo explicando os tipos de Join. Para facilitar a explicação e o entendimento, vou demonstrar com duas tabelas fictícias Fornecedor e Pagamento representadas a seguir:







Percebam que o fornecedor de código 1 não possui registro na tabela de Pagamento.

Os tipos de Join são os seguinte:

Inner Join:&nbsp;Somente os registros das duas tabelas, que possuem o mesmo valor para um determinado campo são retornados. (Como resultado ambas as consultas irão trazer apenas os registros dos fornecedores de código 2 e 3.)

Exemplo:
Select * from fornecedor inner join pagamento on&nbsp;
pagamento.cod_fornecedor = fornecedor.cod_fornecedor

Outra forma:
Select * from&nbsp;fornecedor&nbsp;,pagamento&nbsp;
Where&nbsp;pagamento.cod_fornecedor&nbsp;=&nbsp;fornecedor.cod_fornecedor


Cross Join:&nbsp;Ele simplesmente obtém todos os  registros de todas as tabelas e faz o produto cartesiano.




Exemplos:

Select * from fornecedor,pagamento



Antigamente podia ser feito dessa forma, mas não está no padrão ANSI SQL:

Select * from&nbsp;fornecedor,pagamento

Where&nbsp;pagamento.cod_fornecedor&nbsp;*=*&nbsp;fornecedor.cod_fornecedor




Outer Join:&nbsp;Retornam os registros das duas tabelas que possuam alguma relação e também os registros que não entram nesta relação.

Como estava no sistema:
Select * from&nbsp;fornecedor,pagamento
Where&nbsp;pagamento.cod_fornecedor&nbsp;=*&nbsp;fornecedor.cod_fornecedor

Transformando a consulta acima para o Padrão SQL ANSI:
Select * from&nbsp;fornecedor&nbsp;left outer &nbsp;join&nbsp;pagamento&nbsp;on&nbsp;
pagamento.cod_fornecedor&nbsp;=&nbsp;fornecedor.cod_fornecedor

Há uma equivalência em termos de funcionalidade &nbsp;na ordem em relação às tabelas, e não à comparação feita após a palavra chave ON. Ou seja:

Select * from&nbsp;fornecedor&nbsp;&nbsp;left outer &nbsp;join&nbsp;pagamento&nbsp;on&nbsp;
pagamento.cod_fornecedor&nbsp;=&nbsp;fornecedor.cod_fornecedor

É igual a:
Select * from&nbsp;fornecedor&nbsp;left outer &nbsp;join&nbsp;pagamento&nbsp;on&nbsp;
fornecedor.cod_fornecedor&nbsp; =&nbsp;pagamento.cod_fornecedor

E também a:
Select * from&nbsp;pagamento&nbsp;right outer &nbsp;join fornecedor&nbsp;&nbsp;on&nbsp;pagamento.cod_fornecedor&nbsp;=&nbsp;fornecedor.cod_fornecedor


É isso pessoal, resuminho básico dos Joins no padrão ANSI SQL para que sua aplicação, pelo menos teoricamente, funcione em qualquer versão do SQL Server. Usando o padrão, sua aplicação também vai servir para outros bancos, o Oracle, se não me engano, começou a adotar esse padrão na versão 9i.