Set Operators – UNION (Transact-SQL)

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureAzure Synapse AnalyticsPDW (Analytics Platform System)Ponto de extremidade de SQL no Microsoft FabricWarehouse no Microsoft Fabric

Concatena os resultados de duas consultas em um único conjunto de resultados. Você controla se o conjunto de resultados inclui linhas duplicadas:

  • UNION ALL – inclui duplicatas.
  • UNION – exclui duplicatas.

Uma operação UNION é diferente de uma JOIN :

  • Uma UNION concatena conjuntos de resultados de duas consultas. Mas uma UNION não cria linhas individuais com base em colunas coletadas de duas tabelas.
  • Uma JOIN compara colunas de duas tabelas para criar linhas de resultado compostas de colunas de duas tabelas.

A seguir são apresentadas as regras básicas de combinação dos conjuntos de resultados de duas consultas usando UNION:

  • O número e a ordem das colunas devem ser iguais em todas as consultas.

  • Os tipos de dados devem ser compatíveis.

Convenções de sintaxe de Transact-SQL

Sintaxe

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

Observação

Para exibir a sintaxe do Transact-SQL para o SQL Server 2014 (12.x) e versões anteriores, confira a Documentação das versões anteriores.

Argumentos

<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. 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. Quando os tipos de dados diferirem, o tipo de dados resultante será determinado com base nas regras de precedência de tipo de dados. 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. Para obter mais informações, confira Precisão, escala e comprimento (Transact-SQL).

As colunas do tipo de dados xml precisam ser iguais. Todas as colunas devem ter tipo para um esquema XML ou sem-tipo. Se tiverem tipo, elas deverão ter o tipo igual ao da coleção de esquema XML.

UNION
Especifica que vários conjuntos de resultados serão combinados e retornados como um único conjunto de resultados.

ALL
Incorpora todas as linhas nos resultados, incluindo duplicatas. Se não for especificado, as linhas duplicadas serão removidas.

Exemplos

a. Usando uma UNION simples

No exemplo a seguir, o conjunto de resultados inclui o conteúdo das colunas ProductModelID e Name das tabelas ProductModel e Gloves.

-- 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. Usando SELECT INTO com 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. A tabela Gloves é criada na primeira instrução SELECT.

-- 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. Usando UNION de duas instruções SELECT com ORDER BY

A ordem de determinados parâmetros usados com a cláusula UNION é importante. 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.

-- 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. Usando UNION de três instruções SELECT para mostrar os efeitos de ALL e parênteses

Os exemplos a seguir usam UNION para combinar os resultados de três tabelas que têm as mesmas 5 linhas de dados. O primeiro exemplo usa UNION ALL para mostrar os registros duplicados e retorna todas as 15 linhas. 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.

O terceiro exemplo usa ALL com a primeira UNION e parênteses cercam a segunda UNION que não está usando 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. Essas 5 linhas são combinadas com os resultados do primeiro SELECT usando as palavras-chave UNION ALL. Esse exemplo não remove as duplicatas entre os dois conjuntos de cinco linhas. O resultado final tem 10 linhas.

-- 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 Synapse Analytics e PDW (Analytics Platform System)

E. Usando uma UNION simples

No exemplo a seguir, o conjunto de resultados inclui o conteúdo das colunas CustomerKey das duas tabelas FactInternetSales e DimCustomer. Como a palavra-chave ALL não é usada, as duplicatas são excluídas dos resultados.

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

F. Usando UNION de duas instruções SELECT com 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. 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.

-- 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. Usando UNION de duas instruções SELECT com WHERE e 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.

-- 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. Usando UNION de três instruções SELECT para mostrar os efeitos de ALL e de parênteses

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.

O primeiro exemplo usa UNION ALL para mostrar registros duplicados e retorna cada linha na tabela de origem três vezes. 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.

O terceiro exemplo usa ALL com a primeira UNION e parênteses delimitando a segunda UNION que não está usando ALL. A segunda UNION é processada primeiro porque está entre parênteses. Ela retorna somente as linhas não duplicadas da tabela porque a opção ALL não é usada e as duplicatas são removidas. Essas linhas são combinadas com os resultados da primeira SELECT usando as palavras-chave UNION ALL. Esse exemplo não remove as duplicatas entre os dois conjuntos.

-- 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ém

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