Set Operators – UNION (Transact-SQL)Set Operators - UNION (Transact-SQL)

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure simSQL Data Warehouse do Azure simParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Combina os resultados de duas ou mais consultas em um único conjunto de resultados.Combines the results of two or more queries into a single result set. Esse conjunto inclui todas as linhas que pertencem a todas as consultas na união.This set includes all the rows that belong to all queries in the union. A operação UNION é diferente de usar junções que combinam colunas de duas tabelas.The UNION operation is different from using joins that combine columns from two tables.

A seguir são apresentadas as regras básicas de combinação dos conjuntos de resultados de duas consultas usando UNION:The following are basic rules for combining the result sets of two queries by using UNION:

  • O número e a ordem das colunas devem ser iguais em todas as consultas.The number and the order of the columns must be the same in all queries.

  • Os tipos de dados devem ser compatíveis.The data types must be compatible.

Ícone de link do tópico Convenções de sintaxe de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxeSyntax

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

ArgumentosArguments

<query_specification> | ( <query_expression> ) é uma especificação de consulta ou uma expressão de consulta que retorna dados a serem combinados com os dados de outra especificação de consulta ou expressão 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. As definições das colunas que fazem parte de uma operação UNION não precisam ser iguais, mas devem ser compatíveis por meio de conversão 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. Quando os tipos de dados diferirem, o tipo de dados resultante será determinado com base nas regras de precedência de tipo de dados.When data types differ, the resulting data type is determined based on the rules for data type precedence. Quando os tipos são iguais mas diferem em precisão, escala ou extensão, o resultado se baseia nas mesmas regras para combinação de expressões.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 obter mais informações, consulte Precisão, escala e comprimento (Transact-SQL).For more information, see Precision, Scale, and Length (Transact-SQL).

As colunas do tipo de dados xml precisam ser iguais.Columns of the xml data type must be equal. Todas as colunas devem ter tipo para um esquema XML ou sem-tipo.All columns must be either typed to an XML schema or untyped. Se tiverem tipo, elas deverão ter o tipo igual ao da coleção de esquema XML.If typed, they must be typed to the same XML schema collection.

UNIONUNION
Especifica que vários conjuntos de resultados serão combinados e retornados como um único conjunto de resultados.Specifies that multiple result sets are to be combined and returned as a single result set.

ALLALL
Incorpora todas as linhas nos resultados, incluindo duplicatas.Incorporates all rows into the results, including duplicates. Se não for especificado, as linhas duplicadas serão removidas.If not specified, duplicate rows are removed.

ExemplosExamples

A.A. Usando uma UNION simplesUsing a simple UNION

No exemplo a seguir, o conjunto de resultados inclui o conteúdo das colunas ProductModelID e Name das tabelas ProductModel e 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. Usando SELECT INTO com UNIONUsing SELECT INTO with UNION

No exemplo a seguir, a cláusula INTO da segunda instrução SELECT especifica que a tabela denominada ProductResults mantém o conjunto de resultados final da união das colunas selecionadas das tabelas ProductModel e 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. A tabela Gloves é criada na primeira instrução 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. Usando UNION de duas instruções SELECT com ORDER BYUsing UNION of two SELECT statements with ORDER BY

A ordem de determinados parâmetros usados com a cláusula UNION é importante.The order of certain parameters used with the UNION clause is important. O exemplo a seguir mostra o uso incorreto e correto de UNION em duas instruções SELECT nas quais uma coluna deve ser renomeada na saída.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. Usando UNION de três instruções SELECT para mostrar os efeitos de ALL e parêntesesUsing UNION of three SELECT statements to show the effects of ALL and parentheses

Os exemplos a seguir usam UNION para combinar os resultados de três tabelas que têm as mesmas 5 linhas de dados.The following examples use UNION to combine the results of three tables that all have the same 5 rows of data. O primeiro exemplo usa UNION ALL para mostrar os registros duplicados e retorna todas as 15 linhas.The first example uses UNION ALL to show the duplicated records, and returns all 15 rows. O segundo exemplo usa UNION sem ALL para eliminar as linhas duplicadas dos resultados combinados das três instruções SELECT e retorna 5 linhas.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.

O terceiro exemplo usa ALL com a primeira UNION e parênteses cercam a segunda UNION que não está usando ALL.The third example uses ALL with the first UNION and parentheses enclose the second UNION that isn't using ALL. A segunda UNION é processada primeiro porque está entre parênteses e retorna 5 linhas porque a opção ALL não é usada e as duplicatas são removidas.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. Essas 5 linhas são combinadas com os resultados do primeiro SELECT usando as palavras-chave UNION ALL.These 5 rows are combined with the results of the first SELECT by using the UNION ALL keywords. Esse exemplo não remove as duplicatas entre os dois conjuntos de cinco linhas.This example doesn't remove the duplicates between the two sets of five rows. O resultado final tem 10 linhas.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  
  

Exemplos: Azure SQL Data WarehouseAzure SQL Data Warehouse e Parallel Data WarehouseParallel Data WarehouseExamples: Azure SQL Data WarehouseAzure SQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse

E.E. Usando uma UNION simplesUsing a simple UNION

No exemplo a seguir, o conjunto de resultados inclui o conteúdo das colunas CustomerKey das duas tabelas FactInternetSales e DimCustomer.In the following example, the result set includes the contents of the CustomerKey columns of both the FactInternetSales and DimCustomer tables. Como a palavra-chave ALL não é usada, as duplicatas são excluídas dos 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. Usando UNION de duas instruções SELECT com ORDER BYUsing UNION of two SELECT statements with ORDER BY

Quando qualquer instrução SELECT em uma instrução UNION incluir uma cláusula ORDER BY, essa cláusula deverá ser colocada após todas as instruções SELECT.When any SELECT statement in a UNION statement includes an ORDER BY clause, that clause should be placed after all SELECT statements. O exemplo a seguir mostra o uso incorreto e correto de UNION em duas instruções SELECT nas quais uma coluna é ordenada com 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. Usando UNION de duas instruções SELECT com WHERE e ORDER BYUsing UNION of two SELECT statements with WHERE and ORDER BY

O exemplo a seguir mostra o uso incorreto e correto de UNION em duas instruções SELECT nas quais WHERE e ORDER BY são necessários.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. Usando UNION de três instruções SELECT para mostrar os efeitos de ALL e de parêntesesUsing UNION of three SELECT statements to show effects of ALL and parentheses

Os exemplos a seguir usam UNION para combinar os resultados da mesma tabela para demonstrar os efeitos de ALL e de parênteses ao 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.

O primeiro exemplo usa UNION ALL para mostrar registros duplicados e retorna cada linha na tabela de origem três vezes.The first example uses UNION ALL to show duplicated records and returns each row in the source table three times. O segundo exemplo usa UNION sem ALL para eliminar as linhas duplicadas dos resultados combinados das três instruções SELECT e retorna somente as linhas não duplicadas da tabela de origem.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.

O terceiro exemplo usa ALL com a primeira UNION e parênteses delimitando a segunda UNION que não está usando ALL.The third example uses ALL with the first UNION and parentheses enclosing the second UNION that isn't using ALL. A segunda UNION é processada primeiro porque está entre parênteses.The second UNION is processed first because it is in parentheses. Ela retorna somente as linhas não duplicadas da tabela porque a opção ALL não é usada e as duplicatas são removidas.It returns only the unduplicated rows from the table because the ALL option isn't used and duplicates are removed. Essas linhas são combinadas com os resultados da primeira SELECT usando as palavras-chave UNION ALL.These rows are combined with the results of the first SELECT by using the UNION ALL keywords. Esse exemplo não remove as duplicatas entre os dois 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 TambémSee Also

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