Set Operators – UNION (Transact-SQL)
Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics PDW (Analytics Platform System) Ponto de extremidade de análise do SQL Warehouse 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 ] }
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
);