Free CSS Button Css3Menu.com

Tutoriais » SQL » Junção Completa »
Definindo:
Este comando coloca lado-a-lado as tuplas de duas tabelas que atendam a uma condição de comparação de campos, considerando o EMPARELHAMENTO de TODAS as tuplas de ambas as tabelas. As tuplas que obedecem a condição são emparelhadas e as que não atendem são colocadas ao lado de linhas nulas.
Em livros o termo 'lado-a-lado' pode ser escrito: EMPARELHAR.
A junção Completa (ou Aberta) pode ser executada com o operador FULL OUTER JOIN. Desse modo:
       SELECT * FROM funcionarios FULL OUTER JOIN departamentos ON funcionarios.id_depto=departamentos.id_depto     
Mas o MySQL (até a 5.0) NÃO implementa este operador.
Podemos resolver isso considerando que a Junção Completa é a UNIÃO entre a Junção Aberta pela ESQUERDA com a Junção Aberta pela Direita.
Então, podemos escrever assim:
       SELECT * FROM funcionarios LEFT JOIN departamentos ON funcionarios.id_depto=departamentos.id_depto
       UNION
       (SELECT * FROM funcionarios RIGHT JOIN departamentos ON funcionarios.id_depto=departamentos.id_depto);     
Aqui já estamos vendo o operador UNION implementando a operação de União.

Nota: O SGBD PostgreSQL implementa o operador FULL OUTER JOIN.
Podemos criar uma tabela no banco de dados com o comando create table, copiando a estrutura de uma tabela e as tuplas que são resultado de um comando SQL
Por exemplo, fazemos uma Junção e depois criamos a tabela com o resultado, desta forma
       CREATE TABLE atua01 AS
             ( SELECT * FROM funcionarios LEFT JOIN departamentos ON funcionarios.id_depto=departamentos.id_depto
                        UNION
              (SELECT * FROM funcionarios RIGHT JOIN departamentos ON funcionarios.id_depto=departamentos.id_depto));     
Estas tabelas ficam GRAVADAS no disco rígido e passam a constar no dicionário de dados da base.
Podemos também criar uma tabela 'temporária' (fica em memória RAM somente enquanto se executa a sessão de conexão com o SGBD).
Este 'tipo de tabela' é implementado em vários SGBDs.
Criando uma tabela temporária e a seguir mostrando seu conteúdo
       CREATE TEMPORARY TABLE atua01 AS
            ( SELECT * FROM funcionarios LEFT JOIN departamentos ON funcionarios.id_depto=departamentos.id_depto
                       UNION
             (SELECT * FROM funcionarios RIGHT JOIN departamentos ON funcionarios.id_depto=departamentos.id_depto));
       SELECT * FROM atua01;     
CUIDADO!
A criação de tabelas (temporárias ou não), em alguns SGBDs exige que as estruturas das tabelas NÃO tenham nomes de campos repetidos.
Mas... e SE as tabelas envolvidas na Junção Aberta tiverem campos com o mesmo nome? Como fazemos?
Pode-se combinar a Junção Aberta com a operação de PROJEÇÃO, fazendo gerar uma tabela sem nomes de campos repetidos.
Uma outra alternativa seria NÃO atribuir nomes iguais em campos distintos em diferentes tabelas. Assim se um campo em uma tabela for Chave Primária o nome do campo pode ser: PK_NomeDoCampo... e um campo correspondente seria FK_NomeDoCampo.