Free CSS Button Css3Menu.com

Tutoriais » SQL » Junção Aberta »
Definindo:
Este comando coloca lado-a-lado as tuplas de duas tabelas que atendam a uma condição de comparação de campos, considerando uma das tabelas listadas completamente, ou seja, mesmo que não atenda a condição as tuplas de uma das tabelas aparece. Em livros o termo 'lado-a-lado' pode ser escrito: EMPARELHAR.

Vamos observar a junção aberta.
Quando fizemos:
       SELECT * FROM funcionarios;     
Vemos 43 Funcionários.
Quando fazemos:
       SELECT * FROM funcionarios, departamentos WHERE funcionarios.id_depto=departamentos.id_depto;     
Vemos 37 funcionários, ou seja, somente 37 dos 43 funcionarios tem um departamento relacionado... Pergunta:
Quais são os funcionarios que não tem o departamento relacionado?
Para responder esta pergunta podemos escrever o comando de Junção Aberta para o lado onde está a tabela funcionarios.
Tratando como Junção Aberta pela esquerda.
       SELECT funcionarios.*
              FROM funcionarios LEFT JOIN departamentos
                   ON funcionarios.id_depto=departamentos.id_depto;     
Nota-se que já combinamos o comando de Junção com uma Projeção.
Este comando retorna as duas estruturas lado-a-lado

Pode ser mais interessante procurar somente os campos da tabela funcionarios, para isso podemos escrever:
       SELECT funcionarios.*
              FROM funcionarios LEFT JOIN departamentos
                   ON funcionarios.id_depto=departamentos.id_depto
              WHERE
                   departamentos.id_depto IS NULL;     
Este comando implementa uma junção aberta pela esquerda + seleção (onde o id_depto de departamentos É NULL) + projeção (somente os campos de funcionários)
Note a seleção sobre os departamentos com id_depto NULO, o operador é o IS NULL

De outro modo podemos querer saber:
Existem departamentos sem funcionarios ligados a eles, se sim, quais são estes departamentos?
       SELECT departamentos.*
              FROM funcionarios RIGHT JOIN departamentos
                   ON funcionarios.id_depto=departamentos.id_depto
              WHERE funcionarios.id_funcionario IS NULL;     

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 Clientes.*
                     FROM Clientes LEFT JOIN Pedidos
                          ON Clientes.Cod_Cliente=Pedidos.Cod_Cliente);     
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 Clientes.*
                     FROM Clientes LEFT JOIN Pedidos
                          ON Clientes.Cod_Cliente=Pedidos.Cod_Cliente);
       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.