Partilhar via


Operadores de Conjuntos - UNION (Transact-SQL)

Aplica-se a:SQL ServerBase de Dados SQL do AzureInstância Gerida do Azure SQLAzure Synapse AnalyticsSistema de Plataforma de Análise (PDW)Ponto de Extremidade de Análise SQL no Microsoft FabricArmazém no Microsoft FabricBase de Dados SQL 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:

  • UNIÃO TODOS - Inclui duplicatas.
  • UNIÃO - Exclui duplicatas.

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

  • Um UNION concatena conjuntos de resultados de duas consultas. Mas uma UNIÃO não cria linhas individuais a partir de colunas reunidas de duas tabelas.
  • Um JOIN compara colunas de duas tabelas para criar linhas de resultado compostas por colunas de duas tabelas.

A seguir estão as regras básicas para combinar os conjuntos de resultados de duas consultas usando UNION:

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

  • Os tipos de dados devem ser compatíveis.

Transact-SQL convenções de sintaxe

Syntax

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

Arguments

< > query_specification | <( query_expression> ) É uma especificação de consulta ou 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 as mesmas, mas devem ser compatíveis por meio de conversão implícita. Quando os tipos de dados diferem, o tipo de dados resultante é determinado com base nas regras de precedência do tipo de dados. Quando os tipos são os mesmos, mas diferem em precisão, escala ou comprimento, o resultado é baseado nas mesmas regras para combinar expressões. Para obter mais informações, consulte Precisão, escala e comprimento (Transact-SQL).

As colunas do tipo de dados xml devem ser iguais. Todas as colunas devem ser digitadas em um esquema XML ou não tipadas. Se digitados, eles devem ser digitados na mesma coleção de esquema XML.

UNION
Especifica que vários conjuntos de resultados devem ser 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.

Examples

A. Usando uma simples UNIÃO

No exemplo a seguir, o conjunto de resultados inclui o conteúdo das ProductModelID colunas e Name das ProductModel tabelas 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 INTO cláusula na segunda SELECT instrução especifica que a tabela nomeada ProductResults contém o conjunto de resultados finais da união das colunas selecionadas das ProductModel tabelas e Gloves . A Gloves tabela é criada na primeira SELECT instrução.

-- 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 certos parâmetros utilizada com a cláusula UNION é importante. O exemplo a seguir mostra o uso incorreto e correto de UNION duas SELECT instruções 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 são usados 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 SELECT instruções e retorna 5 linhas.

O terceiro exemplo usa ALL com o primeiro UNION e entre parênteses o segundo UNION que não está usando ALL. O segundo UNION é processado primeiro porque está entre parênteses e retorna 5 linhas porque a ALL opção não é usada e as duplicatas são removidas. Estas 5 linhas são combinadas com os resultados da primeira SELECT usando as UNION ALL palavras-chave. Este 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 and Analytics Platform System (PDW)

E. Usando uma simples UNIÃO

No exemplo a seguir, o conjunto de resultados inclui o CustomerKey conteúdo das colunas das FactInternetSales tabelas 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 inclui uma cláusula ORDER BY, essa cláusula deve ser colocada após todas as instruções SELECT. O exemplo a seguir mostra o uso incorreto e correto de UNION duas SELECT instruções 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 duas SELECT instruções onde 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 efeitos de ALL e parênteses

Os exemplos a seguir usam UNION para combinar os resultados da mesma tabela para demonstrar os efeitos de ALL e 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 without ALL para eliminar as linhas duplicadas dos resultados combinados das três SELECT instruções e retorna apenas as linhas não duplicadas da tabela de origem.

O terceiro exemplo usa ALL com o primeiro UNION e parênteses colocando o segundo UNION que não está usando ALL. O segundo UNION é processado primeiro porque está entre parênteses. Ele retorna apenas as linhas não duplicadas da tabela porque a ALL opção não é usada e as duplicatas são removidas. Essas linhas são combinadas com os resultados da primeira SELECT usando as UNION ALL palavras-chave. Este 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  
);  

Ver também

SELECIONAR (Transact-SQL)
SELECT Exemplos (Transact-SQL)