Dela via


Ange operatorer – UNION (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalysplattformssystem (PDW)SQL-analysslutpunkt i Microsoft FabricLager i Microsoft FabricSQL-databas i Förhandsversion av Microsoft Fabric

Sammanfogar resultatet av två frågor till en enda resultatuppsättning. Du styr om resultatuppsättningen innehåller dubbletter av rader:

  • UNION ALL – Innehåller dubbletter.
  • UNION – Exkluderar dubbletter.

En UNION-åtgärd skiljer sig från en JOIN:

  • En UNION sammanfogar resultatuppsättningar från två frågor. Men en UNION skapar inte enskilda rader från kolumner som samlats in från två tabeller.
  • En JOIN jämför kolumner från två tabeller för att skapa resultatrader som består av kolumner från två tabeller.

Följande är grundläggande regler för att kombinera resultatuppsättningarna för två frågor med hjälp av UNION:

  • Antalet och ordningen på kolumnerna måste vara samma i alla frågor.

  • Datatyperna måste vara kompatibla.

Transact-SQL syntaxkonventioner

Syntax

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

Arguments

< > query_specification | ( <query_expression> ) Är en frågespecifikation eller ett frågeuttryck som returnerar data som ska kombineras med data från en annan frågespecifikation eller ett frågeuttryck. Definitionerna av kolumnerna som ingår i en UNION-åtgärd behöver inte vara desamma, men de måste vara kompatibla genom implicit konvertering. När datatyperna skiljer sig åt bestäms den resulterande datatypen baserat på reglerna för datatypsprioritet. När typerna är samma men skiljer sig åt i precision, skala eller längd baseras resultatet på samma regler för att kombinera uttryck. Mer information finns i Precision, Skala och Längd (Transact-SQL).

Kolumner av xml-datatypen måste vara lika med. Alla kolumner måste antingen skrivas till ett XML-schema eller vara otypade. Om de skrivs måste de skrivas till samma XML-schemasamling.

UNION
Anger att flera resultatuppsättningar ska kombineras och returneras som en enda resultatuppsättning.

ALL
Innehåller alla rader i resultatet, inklusive dubbletter. Om du inte anger det tas dubbletter av rader bort.

Examples

A. Använda en enkel UNION

I följande exempel innehåller resultatuppsättningen innehållet i kolumnerna ProductModelID och Name i både tabellerna ProductModel och 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. Använda SELECT INTO med UNION

I följande exempel INTO anger satsen i den andra SELECT instruktionen att tabellen med namnet ProductResults innehåller den slutliga resultatuppsättningen för unionen av de valda kolumnerna i tabellerna ProductModel och Gloves . Tabellen Gloves skapas i den första SELECT instruktionen.

-- 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. Använda UNION för två SELECT-instruktioner med ORDER BY

Ordningen på vissa parametrar som används med UNION-satsen är viktig. I följande exempel visas felaktig och korrekt användning av UNION i två SELECT instruktioner där en kolumn ska byta namn i utdata.

-- 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. Använda UNION med tre SELECT-instruktioner för att visa effekterna av ALLA och parenteser

I följande exempel används UNION för att kombinera resultatet från tre tabeller som alla har samma 5 rader med data. Det första exemplet används UNION ALL för att visa de duplicerade posterna och returnerar alla 15 rader. Det andra exemplet använder UNION utan ALL för att eliminera duplicerade rader från de kombinerade resultaten av de tre SELECT uttrycken och returnerar 5 rader.

Det tredje exemplet använder ALL med den första UNION och parenteser omger den andra UNION som inte använder ALL. Den andra UNION bearbetas först eftersom den är inom parenteser och returnerar 5 rader eftersom ALL alternativet inte används och dubbletter tas bort. Dessa 5 rader kombineras med resultatet från den första SELECT med hjälp av nyckelorden UNION ALL . Det här exemplet tar inte bort dubbletter mellan de två uppsättningarna med fem rader. Slutresultatet har 10 rader.

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

Exempel: Azure Synapse Analytics and Analytics Platform System (PDW)

E. Använda en enkel UNION

I följande exempel innehåller resultatuppsättningen innehållet i kolumnerna CustomerKey i både tabellerna FactInternetSales och DimCustomer . Eftersom nyckelordet ALL inte används undantas dubbletter från resultaten.

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

F. Använda UNION för två SELECT-instruktioner med ORDER BY

När en SELECT-instruktion i en UNION-instruktion innehåller en ORDER BY-sats bör den satsen placeras efter alla SELECT-instruktioner. I följande exempel visas felaktig och korrekt användning av UNION i två SELECT instruktioner där en kolumn sorteras med 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. Använda UNION för två SELECT-instruktioner med WHERE och ORDER BY

I följande exempel visas felaktig och korrekt användning av UNION i två SELECT instruktioner där WHERE och ORDER BY behövs.

-- 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. Använda UNION med tre SELECT-instruktioner för att visa effekterna av ALLA och parenteser

I följande exempel används UNION för att kombinera resultatet från samma tabell för att visa effekterna av ALLA och parenteser när du använder UNION.

Det första exemplet används UNION ALL för att visa duplicerade poster och returnerar varje rad i källtabellen tre gånger. Det andra exemplet använder UNION utan ALL för att eliminera duplicerade rader från de kombinerade resultaten av de tre SELECT uttrycken och returnerar endast de otillbörliga raderna från källtabellen.

Det tredje exemplet används ALL med den första UNION och parenteser som omger den andra UNION som inte använder ALL. Den andra UNION bearbetas först eftersom den är inom parenteser. Den returnerar endast de onödiga raderna från tabellen eftersom ALL alternativet inte används och dubbletter tas bort. Dessa rader kombineras med resultatet från den första SELECT med hjälp av nyckelorden UNION ALL . Det här exemplet tar inte bort dubbletter mellan de två uppsättningarna.

-- 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  
);  

See Also

SELECT (Transact-SQL)
SELECT-exempel (Transact-SQL)