Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analysplattformssystem (PDW)
SQL-analysslutpunkt i Microsoft Fabric
Lager i Microsoft Fabric
SQL-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
);