SQL em Oracle > DML > Junção de tabelas > Junção Horizontal > Junção externa
Junção externa tl_logo2.jpg

O diagrama entidade relacionamento a seguir apresentado mostra os relacionamentos existentes entre as tabelas EMPLOYEES e DEPARTMENTS. Considerando apenas o relacionamento "Trabalha Em" verificamos que um empregado pode não ter um departamento atribuído, assim como um departamento pode não ter empregados atribuídos. Os empregados que não têm departamento e os departamentos que não têm empregado não aparecem no resultado de uma junção interna, mas aparecem na junção externa. A junção externa é uma extensão da junção interna.

EmployeesDepartments.jpg

Junção externa à esquerda

A junção externa à esquerda estende o resultado da junção interna, pois mostra todas as linhas que são devolvidas pela junção interna e acrescenta as linhas da tabela da esquerda que não têm correspondência na tabela da direita. A junção envolve sempre duas tabelas, sendo a da esquerda a que primeiro aparece no comando. O diagrama apresentado a seguir mostra como funciona este tipo de junção:

JuncaoLeftOuter.jpg

Os comandos apresentados a seguir mostram como fazer a junção externa à esquerda entre as tabelas EMPLOYEES e DEPARTMENTS. Esta operação vai mostrar as linhas obtidas pela junção interna, acrescida dos empregados que não têm um departamento atribuído, o que é possível porque a coluna DEPARTMENT_ID em EMPLOYEES suporta valores nulos:


Sintaxe proprietária ON USING NATURAL JOIN
SELECT
   e.first_name,
   e.last_name,
   d.department_id,
   d.department_name
FROM employees e, departments d
WHERE e.department_id=d.department_id (+);
SELECT
   e.first_name,
   e.last_name,
   d.department_id,
   d.department_name
FROM employees e
LEFT OUTER JOIN departments d ON (e.department_id=d.department_id);
SELECT
   e.first_name,
   e.last_name,
   department_id,
   d.department_name
FROM employees e
LEFT OUTER JOIN departments d USING (department_id);
Não aplicável

bthome.gifTopo


Junção externa à direita

A junção externa à direita funciona da mesma forma que a junção externa à esquerda, mas mostra as linhas da tabela da direita que não têm correspondência com linhas da tabela da esquerda. Este resultado pode ser obtido por uma junção à esquerda trocando a ordem das colunas. O diagrama apresentado a seguir descreve o funcionamento deste tipo de junção:

JuncaoRightOuter.jpg

Os comandos apresentados a seguir mostram como fazer a junção externa à direita entre as tabelas EMPLOYEES e DEPARTMENTS. Esta operação vai mostrar as linhas obtidas pela junção interna, acrescida dos departamentos que não têm um empregado atribuído:


Sintaxe proprietária ON USING NATURAL JOIN
SELECT
   e.first_name,
   e.last_name,
   d.department_id,
   d.department_name
FROM employees e, departments d
WHERE e.department_id (+) =d.department_id;
SELECT
   e.first_name,
   e.last_name,
   d.department_id,
   d.department_name
FROM employees e
RIGHT OUTER JOIN departments d ON (e.department_id=d.department_id);
SELECT
   e.first_name,
   e.last_name,
   department_id,
   d.department_name
FROM employees e
RIGHT OUTER JOIN departments d USING (department_id);
Não aplicável

bthome.gifTopo


Junção externa FULL (à esquerda e à direita)

A junção externa FULL mostra a soma das junções externas à esquerda e à direita, como exemplificado no próximo diagrama:

JuncaoFullOuter.jpg

Os comandos apresentados a seguir mostram como fazer a junção externa FULL entre as tabelas EMPLOYEES e DEPARTMENTS:


Sintaxe proprietária ON USING NATURAL JOIN
SELECT
   e.first_name,
   e.last_name,
   d.department_id,
   d.department_name
FROM employees e, departments d
WHERE e.department_id =d.department_id (+)
UNION
SELECT
   e.first_name,
   e.last_name,
   d.department_id,
   d.department_name
FROM employees e, departments d
WHERE e.department_id (+) =d.department_id;
SELECT
   e.first_name,
   e.last_name,
   d.department_id,
   d.department_name
FROM employees e
FULL OUTER JOIN departments d ON (e.department_id=d.department_id);
SELECT
   e.first_name,
   e.last_name,
   department_id,
   d.department_name
FROM employees e
FULL OUTER JOIN departments d USING (department_id);
Não aplicável

bthome.gifTopo


Realizado por Turtle Learning ®. Última alteração em 2011-08-14