Operadores de conjuntos: UNION (Transact-SQL)Set Operators - UNION (Transact-SQL)

SE APLICA A: síSQL Server síAzure SQL Database síAzure Synapse Analytics (SQL DW) síAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

Concatena los resultados de dos consultas en un único conjunto de resultados.Concatenates the results of two queries into a single result set. Puede controlar si en el conjunto de resultados se incluyen filas duplicadas:You control whether the result set includes duplicate rows:

  • UNION ALL: incluye duplicados.UNION ALL - Includes duplicates.
  • UNION: se excluyen los duplicados.UNION - Excludes duplicates.

Una operación de UNION es distinta de una operación de JOIN :A UNION operation is different from a JOIN:

  • Una operación de UNION concatena conjuntos de resultados de dos consultas.A UNION concatenates result sets from two queries. Pero una operación de UNION no crea filas individuales de columnas obtenidas de dos tablas.But a UNION does not create individual rows from columns gathered from two tables.
  • Una operación de JOIN compara las columnas de dos tablas para crear filas de resultados compuestas de columnas de las dos tablas.A JOIN compares columns from two tables, to create result rows composed of columns from two tables.

A continuación, se muestran las reglas básicas para combinar los conjuntos de resultados de dos consultas con UNION:The following are basic rules for combining the result sets of two queries by using UNION:

  • El número y el orden de las columnas debe ser el mismo en todas las consultas.The number and the order of the columns must be the same in all queries.

  • Los tipos de datos deben ser compatibles.The data types must be compatible.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

{ <query_specification> | ( <query_expression> ) }   
{ UNION [ ALL ]   
  { <query_specification> | ( <query_expression> ) } 
  [ ...n ] }

ArgumentosArguments

<especificación_de_consulta> | ( <expresión_de_consulta> ) es una especificación o expresión de consulta que devuelve datos que se van a combinar con los de otra especificación o expresión de consulta.<query_specification> | ( <query_expression> ) Is a query specification or query expression that returns data to be combined with the data from another query specification or query expression. No es preciso que las definiciones de las columnas que forman parte de una operación UNION sean iguales, pero deben ser compatibles en una conversión implícita.The definitions of the columns that are part of a UNION operation don't have to be the same, but they must be compatible through implicit conversion. Cuando los tipos de datos difieren, el tipo de datos resultante se determina según las reglas de prioridad de tipo de datos.When data types differ, the resulting data type is determined based on the rules for data type precedence. Cuando los tipos son los mismos pero varían en cuanto a precisión, escala o longitud, el resultado se basa en las mismas reglas para combinar expresiones.When the types are the same but differ in precision, scale, or length, the result is based on the same rules for combining expressions. Para obtener más información, vea Precisión, escala y longitud (Transact-SQL).For more information, see Precision, Scale, and Length (Transact-SQL).

Las columnas con el tipo de datos xml deben ser iguales.Columns of the xml data type must be equal. Todas las columnas deben tener un tipo de esquema XML o no tener tipo.All columns must be either typed to an XML schema or untyped. Si tienen tipo, debe ser el de la misma colección de esquemas XML.If typed, they must be typed to the same XML schema collection.

UNIONUNION
Especifica que se deben combinar varios conjuntos de resultados para ser devueltos como un solo conjunto de resultados.Specifies that multiple result sets are to be combined and returned as a single result set.

ALLALL
Incorpora todas las filas a los resultados, incluidos los duplicados.Incorporates all rows into the results, including duplicates. Si no se especifica, las filas duplicadas se quitan.If not specified, duplicate rows are removed.

EjemplosExamples

A.A. Usar una instrucción UNION simpleUsing a simple UNION

En el ejemplo siguiente, el conjunto de resultados incluye el contenido de las columnas ProductModelID y Name de las tablas ProductModel y Gloves.In the following example, the result set includes the contents of the ProductModelID and Name columns of both the ProductModel and Gloves tables.

-- Uses AdventureWorks  
  
IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL  
DROP TABLE dbo.Gloves;  
GO  
-- Create Gloves table.  
SELECT ProductModelID, Name  
INTO dbo.Gloves  
FROM Production.ProductModel  
WHERE ProductModelID IN (3, 4);  
GO  
  
-- Here is the simple union.  
-- Uses AdventureWorks  
  
SELECT ProductModelID, Name  
FROM Production.ProductModel  
WHERE ProductModelID NOT IN (3, 4)  
UNION  
SELECT ProductModelID, Name  
FROM dbo.Gloves  
ORDER BY Name;  
GO  

B.B. Usar SELECT INTO con UNIONUsing SELECT INTO with UNION

En el ejemplo siguiente, la cláusula INTO de la segunda instrucción SELECT especifica que la tabla denominada ProductResults contiene el conjunto final de resultados de la unión de las columnas seleccionadas de las tablas ProductModel y Gloves.In the following example, the INTO clause in the second SELECT statement specifies that the table named ProductResults holds the final result set of the union of the selected columns of the ProductModel and Gloves tables. La tabla Gloves se crea en la primera instrucción SELECT.The Gloves table is created in the first SELECT statement.

-- Uses AdventureWorks  
  
IF OBJECT_ID ('dbo.ProductResults', 'U') IS NOT NULL  
DROP TABLE dbo.ProductResults;  
GO  
IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL  
DROP TABLE dbo.Gloves;  
GO  
-- Create Gloves table.  
SELECT ProductModelID, Name  
INTO dbo.Gloves  
FROM Production.ProductModel  
WHERE ProductModelID IN (3, 4);  
GO  
  
-- Uses AdventureWorks  
  
SELECT ProductModelID, Name  
INTO dbo.ProductResults  
FROM Production.ProductModel  
WHERE ProductModelID NOT IN (3, 4)  
UNION  
SELECT ProductModelID, Name  
FROM dbo.Gloves;  
GO  
  
SELECT ProductModelID, Name   
FROM dbo.ProductResults;  

C.C. Usar UNION con dos instrucciones SELECT y ORDER BYUsing UNION of two SELECT statements with ORDER BY

El orden de algunos parámetros empleados con la cláusula UNION es importante.The order of certain parameters used with the UNION clause is important. En el ejemplo siguiente se muestra el uso correcto e incorrecto de UNION en dos instrucciones SELECT en las que se va a cambiar el nombre de una columna en el resultado.The following example shows the incorrect and correct use of UNION in two SELECT statements in which a column is to be renamed in the output.

-- Uses AdventureWorks  
  
IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL  
DROP TABLE dbo.Gloves;  
GO  
-- Create Gloves table.  
SELECT ProductModelID, Name  
INTO dbo.Gloves  
FROM Production.ProductModel  
WHERE ProductModelID IN (3, 4);  
GO  
  
/* INCORRECT */  
-- Uses AdventureWorks  
  
SELECT ProductModelID, Name  
FROM Production.ProductModel  
WHERE ProductModelID NOT IN (3, 4)  
ORDER BY Name  
UNION  
SELECT ProductModelID, Name  
FROM dbo.Gloves;  
GO  
  
/* CORRECT */  
-- Uses AdventureWorks  
  
SELECT ProductModelID, Name  
FROM Production.ProductModel  
WHERE ProductModelID NOT IN (3, 4)  
UNION  
SELECT ProductModelID, Name  
FROM dbo.Gloves  
ORDER BY Name;  
GO  

D.D. Usar UNION de tres instrucciones SELECT para mostrar los efectos de ALL y los paréntesisUsing UNION of three SELECT statements to show the effects of ALL and parentheses

En los siguientes ejemplos se utiliza UNION para combinar los resultados de tres tablas que tienen las mismas 5 filas de datos.The following examples use UNION to combine the results of three tables that all have the same 5 rows of data. En el primer ejemplo se utiliza UNION ALL para mostrar los registros duplicados y se devuelven las 15 filas.The first example uses UNION ALL to show the duplicated records, and returns all 15 rows. En el segundo ejemplo se utiliza UNION sin ALL para eliminar las filas duplicadas de los resultados combinados de las tres instrucciones SELECT y se devuelven 5 filas.The second example uses UNION without ALL to eliminate the duplicate rows from the combined results of the three SELECT statements, and returns 5 rows.

En el tercer ejemplo, se utiliza ALL con la primera operación UNION y los paréntesis incluyen la segunda cláusula UNION que no utiliza ALL.The third example uses ALL with the first UNION and parentheses enclose the second UNION that isn't using ALL. La segunda operación UNION se procesa en primer lugar porque se encuentra entre paréntesis. Devuelve 5 filas porque no se utiliza la opción ALL y se quitan los duplicados.The second UNION is processed first because it's in parentheses, and returns 5 rows because the ALL option isn't used and the duplicates are removed. Estas 5 filas se combinan con los resultados del primer SELECT mediante las palabras clave UNION ALL.These 5 rows are combined with the results of the first SELECT by using the UNION ALL keywords. En este ejemplo no se quitan los duplicados entre los dos conjuntos de cinco filas.This example doesn't remove the duplicates between the two sets of five rows. El resultado final es de 10 filas.The final result has 10 rows.

-- Uses AdventureWorks  
  
IF OBJECT_ID ('dbo.EmployeeOne', 'U') IS NOT NULL  
DROP TABLE dbo.EmployeeOne;  
GO  
IF OBJECT_ID ('dbo.EmployeeTwo', 'U') IS NOT NULL  
DROP TABLE dbo.EmployeeTwo;  
GO  
IF OBJECT_ID ('dbo.EmployeeThree', 'U') IS NOT NULL  
DROP TABLE dbo.EmployeeThree;  
GO  
  
SELECT pp.LastName, pp.FirstName, e.JobTitle   
INTO dbo.EmployeeOne  
FROM Person.Person AS pp JOIN HumanResources.Employee AS e  
ON e.BusinessEntityID = pp.BusinessEntityID  
WHERE LastName = 'Johnson';  
GO  
SELECT pp.LastName, pp.FirstName, e.JobTitle   
INTO dbo.EmployeeTwo  
FROM Person.Person AS pp JOIN HumanResources.Employee AS e  
ON e.BusinessEntityID = pp.BusinessEntityID  
WHERE LastName = 'Johnson';  
GO  
SELECT pp.LastName, pp.FirstName, e.JobTitle   
INTO dbo.EmployeeThree  
FROM Person.Person AS pp JOIN HumanResources.Employee AS e  
ON e.BusinessEntityID = pp.BusinessEntityID  
WHERE LastName = 'Johnson';  
GO  
-- Union ALL  
SELECT LastName, FirstName, JobTitle  
FROM dbo.EmployeeOne  
UNION ALL  
SELECT LastName, FirstName ,JobTitle  
FROM dbo.EmployeeTwo  
UNION ALL  
SELECT LastName, FirstName,JobTitle   
FROM dbo.EmployeeThree;  
GO  
  
SELECT LastName, FirstName,JobTitle  
FROM dbo.EmployeeOne  
UNION   
SELECT LastName, FirstName, JobTitle   
FROM dbo.EmployeeTwo  
UNION   
SELECT LastName, FirstName, JobTitle   
FROM dbo.EmployeeThree;  
GO  
  
SELECT LastName, FirstName,JobTitle   
FROM dbo.EmployeeOne  
UNION ALL  
(  
SELECT LastName, FirstName, JobTitle   
FROM dbo.EmployeeTwo  
UNION  
SELECT LastName, FirstName, JobTitle   
FROM dbo.EmployeeThree  
);  
GO  
  

Ejemplos: Azure Synapse Analytics (SQL DW)Azure Synapse Analytics (SQL DW) y Almacenamiento de datos paralelosParallel Data WarehouseExamples: Azure Synapse Analytics (SQL DW)Azure Synapse Analytics (SQL DW) and Almacenamiento de datos paralelosParallel Data Warehouse

E.E. Usar una instrucción UNION simpleUsing a simple UNION

En el ejemplo siguiente, el conjunto de resultados incluye el contenido de las columnas CustomerKey de las tablas FactInternetSales y DimCustomer.In the following example, the result set includes the contents of the CustomerKey columns of both the FactInternetSales and DimCustomer tables. Puesto que no se usa la palabra clave ALL, los duplicados se excluyen de los resultados.Since the ALL keyword isn't used, duplicates are excluded from the results.

-- Uses AdventureWorks  
  
SELECT CustomerKey   
FROM FactInternetSales    
UNION   
SELECT CustomerKey   
FROM DimCustomer   
ORDER BY CustomerKey;  

F.F. Usar UNION con dos instrucciones SELECT y ORDER BYUsing UNION of two SELECT statements with ORDER BY

Cuando una instrucción SELECT en una instrucción UNION incluye una cláusula ORDER BY, esa cláusula se debe colocar detrás de todas las instrucciones SELECT.When any SELECT statement in a UNION statement includes an ORDER BY clause, that clause should be placed after all SELECT statements. En el ejemplo siguiente se muestra el uso correcto e incorrecto de UNION en dos instrucciones SELECT en las que se ordena una columna con ORDER BY.The following example shows the incorrect and correct use of UNION in two SELECT statements in which a column is ordered with ORDER BY.

-- Uses AdventureWorks  
  
-- INCORRECT  
SELECT CustomerKey   
FROM FactInternetSales    
ORDER BY CustomerKey  
UNION   
SELECT CustomerKey   
FROM DimCustomer  
ORDER BY CustomerKey;  
  
-- CORRECT   
USE AdventureWorksPDW2012;  
  
SELECT CustomerKey   
FROM FactInternetSales    
UNION   
SELECT CustomerKey   
FROM DimCustomer   
ORDER BY CustomerKey;  

G.G. Uso de UNION de dos instrucciones SELECT con WHERE y ORDER BYUsing UNION of two SELECT statements with WHERE and ORDER BY

En el ejemplo siguiente se muestra el uso correcto e incorrecto de UNION en dos instrucciones SELECT en las que se necesita WHERE y ORDER BY.The following example shows the incorrect and correct use of UNION in two SELECT statements where WHERE and ORDER BY are needed.

-- Uses AdventureWorks  
  
-- INCORRECT   
SELECT CustomerKey   
FROM FactInternetSales   
WHERE CustomerKey >= 11000  
ORDER BY CustomerKey   
UNION   
SELECT CustomerKey   
FROM DimCustomer   
ORDER BY CustomerKey;  
  
-- CORRECT  
USE AdventureWorksPDW2012;  
  
SELECT CustomerKey   
FROM FactInternetSales   
WHERE CustomerKey >= 11000  
UNION   
SELECT CustomerKey   
FROM DimCustomer   
ORDER BY CustomerKey;  

H.H. Uso de UNION de tres instrucciones SELECT para mostrar los efectos de ALL y los paréntesisUsing UNION of three SELECT statements to show effects of ALL and parentheses

En los ejemplos siguientes, se usa UNION para combinar los resultados de la misma tabla para mostrar los efectos de ALL y los paréntesis al usar UNION.The following examples use UNION to combine the results of the same table to demonstrate the effects of ALL and parentheses when using UNION.

En el primer ejemplo se usa UNION ALL para mostrar los registros duplicados y se devuelve tres veces cada fila de la tabla de origen.The first example uses UNION ALL to show duplicated records and returns each row in the source table three times. En el segundo ejemplo se usa UNION sin ALL para eliminar las filas duplicadas de los resultados combinados de las tres instrucciones SELECT y solo se devuelven las filas sin duplicar de la tabla de origen.The second example uses UNION without ALL to eliminate the duplicate rows from the combined results of the three SELECT statements and returns only the unduplicated rows from the source table.

En el tercer ejemplo, se usa ALL con la primera operación UNION y los paréntesis para incluir la segunda operación UNION que no usa ALL.The third example uses ALL with the first UNION and parentheses enclosing the second UNION that isn't using ALL. La segunda UNION se procesa en primer lugar porque está entre paréntesis.The second UNION is processed first because it is in parentheses. Solo devuelve las filas sin duplicar de la tabla porque no se usa la opción ALL y los duplicados se quitan.It returns only the unduplicated rows from the table because the ALL option isn't used and duplicates are removed. Estas filas se combinan con los resultados de la primera instrucción SELECT mediante las palabras clave UNION ALL.These rows are combined with the results of the first SELECT by using the UNION ALL keywords. En este ejemplo, no se quitan los duplicados entre los dos conjuntos.This example doesn't remove the duplicates between the two sets.

-- Uses AdventureWorks  
  
SELECT CustomerKey, FirstName, LastName  
FROM DimCustomer  
UNION ALL   
SELECT CustomerKey, FirstName, LastName  
FROM DimCustomer  
UNION ALL   
SELECT CustomerKey, FirstName, LastName  
FROM DimCustomer;  
  
SELECT CustomerKey, FirstName, LastName  
FROM DimCustomer  
UNION   
SELECT CustomerKey, FirstName, LastName  
FROM DimCustomer  
UNION   
SELECT CustomerKey, FirstName, LastName  
FROM DimCustomer;  
  
SELECT CustomerKey, FirstName, LastName  
FROM DimCustomer  
UNION ALL  
(  
SELECT CustomerKey, FirstName, LastName  
FROM DimCustomer  
UNION   
SELECT CustomerKey, FirstName, LastName  
FROM DimCustomer  
);  

Consulte tambiénSee Also

SELECT (Transact-SQL) SELECT (Transact-SQL)
Ejemplos de SELECT (Transact-SQL)SELECT Examples (Transact-SQL)