SQL
UNION / UNION ALL
Buscar..
Introducción
Sintaxis
- SELECCIONE column_1 [, column_2] FROM table_1 [, table_2] [WHERE condicion]
UNION | UNION TODO
SELECCIONE column_1 [, column_2] FROM table_1 [, table_2] [WHERE condicion]
Observaciones
UNION
cláusulas UNION
y UNION ALL
combinan el conjunto de resultados de dos o más sentencias SELECT idénticamente estructuradas en un solo resultado / tabla.
Tanto el recuento de columnas como los tipos de columnas para cada consulta deben coincidir para que funcione UNION
/ UNION ALL
.
La diferencia entre una consulta UNION
y UNION ALL
es que la cláusula UNION
eliminará cualquier fila duplicada en el resultado donde la UNION ALL
no lo hará.
Esta eliminación distinta de registros puede ralentizar significativamente las consultas, incluso si no hay filas distintas para eliminar debido a esto, si sabe que no habrá duplicados (o que no le importe), el valor predeterminado es UNION ALL
para una consulta más optimizada.
Consulta básica de UNION ALL
CREATE TABLE HR_EMPLOYEES
(
PersonID int,
LastName VARCHAR(30),
FirstName VARCHAR(30),
Position VARCHAR(30)
);
CREATE TABLE FINANCE_EMPLOYEES
(
PersonID INT,
LastName VARCHAR(30),
FirstName VARCHAR(30),
Position VARCHAR(30)
);
Digamos que queremos extraer los nombres de todos los managers
de nuestros departamentos.
Usando un UNION
podemos obtener todos los empleados de los departamentos de recursos humanos y finanzas, que ocupan el position
de manager
SELECT
FirstName, LastName
FROM
HR_EMPLOYEES
WHERE
Position = 'manager'
UNION ALL
SELECT
FirstName, LastName
FROM
FINANCE_EMPLOYEES
WHERE
Position = 'manager'
La instrucción UNION
elimina filas duplicadas de los resultados de la consulta. Dado que es posible tener personas con el mismo nombre y posición en ambos departamentos, estamos utilizando UNION ALL
para no eliminar duplicados.
Si desea usar un alias para cada columna de salida, solo puede ponerlos en la primera instrucción de selección, de la siguiente manera:
SELECT
FirstName as 'First Name', LastName as 'Last Name'
FROM
HR_EMPLOYEES
WHERE
Position = 'manager'
UNION ALL
SELECT
FirstName, LastName
FROM
FINANCE_EMPLOYEES
WHERE
Position = 'manager'
Explicación simple y ejemplo.
En lenguaje sencillo:
-
UNION
une 2 conjuntos de resultados mientras elimina duplicados del conjunto de resultados -
UNION ALL
une 2 conjuntos de resultados sin intentar eliminar duplicados
Un error que cometen muchas personas es usar
UNION
cuando no necesitan que se eliminen los duplicados. El costo de rendimiento adicional frente a grandes conjuntos de resultados puede ser muy significativo.
Cuando necesites UNION
Supongamos que necesita filtrar una tabla por 2 atributos diferentes, y ha creado índices no agrupados separados para cada columna. UNION
permite aprovechar ambos índices mientras evita los duplicados.
SELECT C1, C2, C3 FROM Table1 WHERE C1 = @Param1
UNION
SELECT C1, C2, C3 FROM Table1 WHERE C2 = @Param2
Esto simplifica su ajuste de rendimiento, ya que solo se necesitan índices simples para realizar estas consultas de manera óptima. Es posible que incluso pueda arreglárselas con un poco menos de índices no agrupados, lo que también mejora el rendimiento general de escritura en la tabla de origen.
Cuando necesites UNION ALL
Supongamos que aún necesita filtrar una tabla contra 2 atributos, pero no necesita filtrar registros duplicados (ya sea porque no importa o porque sus datos no producirían duplicados durante la unión debido al diseño de su modelo de datos).
SELECT C1 FROM Table1
UNION ALL
SELECT C1 FROM Table2
Esto es especialmente útil cuando se crean vistas que unen datos que están diseñados para particionarse físicamente en varias tablas (tal vez por razones de rendimiento, pero que aún así quieran acumular registros). Dado que los datos ya están divididos, hacer que el motor de la base de datos elimine los duplicados no agrega ningún valor y solo agrega tiempo de procesamiento adicional a las consultas.