Uniones de tablas con FULL JOIN en PostgreSQL

En este artículo veremos cómo hacer uniones de tablas con FULL JOIN en PostgreSQL o también conocido como full outer join. Puedes leer otros artículos para aprender más sobre las uniones u otros artículo para aprender a utilizar INNER JOIN, LEFT JOIN, RIGHT JOIN y CROSS JOIN.

Consejo

Al mostrar columnas de varias tablas, en el caso de que exista la misma columna en varias tablas dará error. Siempre se aconseja utilizar alias de tablas para evitar este problema.

Modelo utilizado

Al final del artículo puedes encontrar el script completo para crear las tablas utilizadas en este ejemplo. Para poder comprender el funcionamiento es necesario que visualices el modelo que está construido en la base de datos. Tenemos dos tablas, departamentos y empleados, las cuales la única relación posible que tienen entre ellas es la columna id_departamento.

Full Join

La tercera cláusula es la llamada full join o según su traducción literal, unión completa. Este tipo de uniones nos devolverá todo lo de la tabla A y todo lo de la tabla B incluyendo los datos que crucen. Este tipo de unión es como si utilizásemos inner join, left join y right join al mismo tiempo.

Sintaxis

La sintaxis para unir tablas con full join es la siguiente:

SELECT tabla1.columna1, tabla1.columnaN, 
       tabla2.columna1, tabla2.columnaN 
FROM nombreTabla1 tabla1
   FULL JOIN nombreTabla2 tabla2 
   ON tabla1.columna1 = tabla2.columna1

Ejemplo

Si queremos mostrar todos los nombres independientemente de si su departamento está o no en la tabla departamentos y además queremos mostrar todos los departamentos tengan o no empleados su sintaxis es la siguiente:

select e.nombre, d.nombre
from empleados e
  full join departamentos d 
  on e.id_departamento=d.id_departamento;

Si ejecutamos la consulta comprobamos como nos muestra los empleados que tienen o no un departamento existente y además todos los nombres de los departamentos tengan o no algún empleado.

Ejemplo completo

Copia y pega el siguiente código en tu consola de PostgreSQL y realiza paso a paso leyendo los comentarios.

--MiguelTroyano.com
-- Borramos las tablas si existen
drop table if exists empleados;
drop table if exists departamentos;

-- Creamos las tablas
create table empleados
(
    id_empleado numeric(2,0) primary key,
    id_departamento numeric(2,0),
    nombre character varying(50),
    puesto character varying(50),
    fecha_alta date,
    sueldo integer
);

create table departamentos
(
    id_departamento numeric(2,0) primary key,
    nombre character varying(50),
    edificio character varying(50),
     planta numeric(2,0)
);

-- Insertamos valores
insert into empleados
values (1,2,'Miguel Troyano','Analista',TO_DATE( '26/09/1986', 'DD/MM/YYYY'),60000),
       (2,2,'Ismael Troyano','Analista',TO_DATE( '01/01/2001', 'DD/MM/YYYY'),60000),
       (3,3,'Jose Troyano','Alta Dirección',TO_DATE( '01/01/2001', 'DD/MM/YYYY'),80000),
       (4,5,'Pilar Redondo','Alta Dirección',TO_DATE( '02/02/2002', 'DD/MM/YYYY'),80000);

insert into departamentos
values (1,'Mantenimiento','Edificio 1',7),
       (2,'Inteligencia de negocio','Edificio 2',7),
       (3,'Recursos Humanos','Edificio 3',8),
       (4,'Finanzas','Edificio 3',8);

-- Mostramos todo lo de la tabla empleados cruce o no
-- con la tabla departamentos y a la inversa.
select e.nombre, d.nombre
from empleados e
  full join departamentos d 
  on e.id_departamento=d.id_departamento;

Escribir un comentario

Este sitio está protegido por reCAPTCHA y se aplican la política de privacidad y los términos de servicio de Google.