Combinación de consultas usando UNION en Oracle

En ocasiones, necesitas unir los resultados de varias consultas SELECT que provienen de diferentes fuentes, tablas o condiciones. Para eso utilizamos la combinación de consultas usando UNION en Oracle, una forma sencilla y potente de combinar múltiples conjuntos de resultados en una sola salida.

En este artículo voy a explicarte cómo funciona UNION en Oracle, en qué se diferencia de otras variantes como UNION ALL, y cuándo utilizar cada una. Verás ejemplos reales con alias y buenas prácticas.

¿Qué hace realmente UNION?

La instrucción UNION en Oracle permite combinar los resultados de dos o más consultas SELECT que tienen el mismo número y tipo de columnas. El resultado final elimina automáticamente los duplicados, devolviendo solo filas únicas.

SELECT nombre FROM empleados
UNION
SELECT nombre FROM exempleados;

Esta consulta devuelve una lista unificada con los nombres que aparecen en ambas tablas, sin repeticiones.

Requisitos clave

  • Las columnas de cada SELECT deben coincidir en número, tipo de dato y orden.
  • Oracle elimina los duplicados por defecto. Si quieres incluirlos, debes usar UNION ALL.
  • Las cláusulas como ORDER BY solo se permiten al final del conjunto completo, no en cada SELECT individual.

Sintaxis básica

SELECT columna1, columna2
FROM tabla1
UNION
SELECT columna1, columna2
FROM tabla2;

Ejemplo práctico

Supón que tienes estas dos tablas:

CREATE TABLE empleados_activos (
    id_empleado NUMBER,
    nombre VARCHAR2(50)
);

CREATE TABLE empleados_inactivos (
    id_empleado NUMBER,
    nombre VARCHAR2(50)
);

Y quieres obtener una lista con todos los nombres, tanto activos como inactivos, sin duplicados:

SELECT nombre FROM empleados_activos
UNION
SELECT nombre FROM empleados_inactivos;

Este resultado contiene solo los nombres distintos de ambas tablas.

¿Y si quiero todos, incluso los duplicados?

Para eso está UNION ALL. A diferencia de UNION, no elimina duplicados, lo que la hace más rápida porque evita el paso de ordenamiento y deduplicación.

SELECT nombre FROM empleados_activos
UNION ALL
SELECT nombre FROM empleados_inactivos;

Este resultado puede incluir nombres repetidos si existen en ambas tablas o dentro de una misma.

¿Cuándo usar UNION y cuándo UNION ALL?

  • Usa UNION si necesitas eliminar duplicados y tu conjunto de resultados no es muy grande.
  • Usa UNION ALL si quieres máximo rendimiento y no te importa que haya duplicados, o si ya sabes que los datos no se repiten.
  • Siempre que puedas, filtra o transforma los datos antes de hacer un UNION, para evitar procesar información innecesaria.

Cuidado con ORDER BY

Oracle solo permite un ORDER BY al final de todo el conjunto de resultados, no en cada SELECT.

Ejemplo correcto:

SELECT nombre FROM empleados_activos
UNION
SELECT nombre FROM empleados_inactivos
ORDER BY nombre;

Ejemplo incorrecto

SELECT nombre FROM empleados_activos ORDER BY nombre
UNION
SELECT nombre FROM empleados_inactivos;

Combinaciones con más de dos consultas

Puedes encadenar tantas consultas como necesites:

SELECT nombre FROM empleados_2023
UNION
SELECT nombre FROM empleados_2022
UNION
SELECT nombre FROM empleados_2021;

Ejemplo

Vamos a crear dos tablas: una para los empleados activos y otra para los empleados que ya no están en la empresa, pero cuyos datos queremos seguir considerando en ciertos informes.

CREATE TABLE empleados_activos (
    id_empleado NUMBER,
    nombre VARCHAR2(50)
);

CREATE TABLE empleados_inactivos (
    id_empleado NUMBER,
    nombre VARCHAR2(50)
);
-- Empleados actualmente activos
INSERT INTO empleados_activos VALUES (1, 'Miguel Troyano');
INSERT INTO empleados_activos VALUES (2, 'Laura Núñez');
INSERT INTO empleados_activos VALUES (3, 'Pilar Redondo');

-- Empleados que ya no están en plantilla
INSERT INTO empleados_inactivos VALUES (10, 'Ismael Troyano');
INSERT INTO empleados_inactivos VALUES (11, 'Pilar Redondo'); -- También aparece en activos
INSERT INTO empleados_inactivos VALUES (12, 'Carlos Ortega');

Y realizamos una consulta para obtener los datos sin duplicados:

SELECT nombre FROM empleados_activos
UNION
SELECT nombre FROM empleados_inactivos;

Observa que “Pilar Redondo” solo aparece una vez, aunque está en ambas tablas.

Ahora realizamos una consulta para obtener los datos, pero esta vez con duplicados:

SELECT nombre FROM empleados_activos
UNION ALL
SELECT nombre FROM empleados_inactivos;

En este caso, “Pilar Redondo” aparece dos veces, porque se encuentra en las dos tablas. Esto permite ver la diferencia clara entre ambos comportamientos.

Conclusión

UNION y UNION ALL son herramientas muy útiles para combinar resultados de distintas consultas en Oracle. Elegir correctamente entre una y otra puede marcar la diferencia entre una consulta rápida y una que sobrecarga el sistema.

Para más información, puedes consultar la documentación oficial de ORACLE.

Escribir un comentario