Buscar..


Introducción

La palabra clave UNION en SQL se usa para combinar los resultados de la instrucción SELECT sin duplicar. Para utilizar UNION y combinar los resultados, ambas sentencias SELECT deben tener el mismo número de columnas con el mismo tipo de datos en el mismo orden, pero la longitud de la columna puede ser diferente.

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.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow