Combinación de consultas usando UNION en PostgreSQL

En este artículo veremos cómo hacer una combinación de consultas usando UNION en PostgreSQL. Con este método podemos escribir dos o más consultas cada una con su lógica o sus tablas de origen y unirlas en un solo resultado.

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 aunque en las combinaciones no hacen falta relaciones entre tablas.

Sintaxis

La sintaxis para combinar consultas con UNION es la siguiente:

SELECT tabla1.columna1, tabla1.columnaN
FROM nombreTabla1 tabla1
UNION
SELECT tabla2.columna1, tabla2.columnaN
FROM nombreTabla2 tabla2

Este tipo de combinación debe seguir siempre dos reglas básicas:

  • El número de columnas y su orden debe ser el mismo en cada consulta.
  • El tipo de dato entre ellas tiene que ser compatible, es decir, si la columna1 de la primera consulta es una fecha, en la columna 1 de la segunda consulta deberá ser una fecha también.
Importante

UNION elimina todos los duplicados que se ocasionen en la combinación de consultas. Si quieres mantener los duplicados usa UNION ALL.

Ejemplo

En el siguiente ejemplo combinamos las tablas de empleados y departamentos. Puedes ver cómo hemos creado una columna nueva llamada tipo para identificar cuál es el origen de los datos, aunque no es obligatorio. Destacar que los resultados se deben ordenar una única vez al final de la combinación y no en cada select por separado.

select 'Empleado' TIPO, id_empleado ID, nombre
from empleados
UNION
select 'Departamento' TIPO, id_departamento ID, nombre
from departamentos
order by tipo, id

Si ejecutamos la consulta comprobamos los resultados:

Combinación de consultas usando UNION en PostgreSQL

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 la combinación de las dos consultas
select 'Empleado' TIPO, id_empleado ID, nombre
from empleados
UNION
select 'Departamento' TIPO, id_departamento ID, nombre
from departamentos
order by tipo, id

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.