SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) SQL Endpoint in Microsoft Fabric Warehouse in Microsoft Fabric
Die UNION-Operation in Transact-SQL ermöglicht es, die Ergebnisse von zwei Abfragen in einem einzigen Ergebnissatz zu kombinieren. Dabei kannst du steuern, ob doppelte Zeilen im Ergebnissatz enthalten sein sollen:
- UNION ALL: Beinhaltet Duplikate.
- UNION: Exkludiert Duplikate.
Eine UNION-Operation unterscheidet sich von einem JOIN:
- Eine UNION konkateniert Ergebnissätze von zwei Abfragen, erzeugt jedoch keine einzelnen Zeilen aus Spalten, die aus zwei Tabellen stammen.
- Ein JOIN vergleicht Spalten aus zwei Tabellen, um Ergebniszeilen aus Spalten beider Tabellen zu erzeugen.
Die folgenden Regeln gelten für die Kombination der Ergebnissätze von zwei Abfragen mit UNION:
- Die Anzahl und Reihenfolge der Spalten müssen in allen Abfragen gleich sein.
- Die Datentypen müssen kompatibel sein.
Transact-SQL-Syntaxkonventionen
Syntax
{ <query_specification> | ( <query_expression> ) } { UNION [ ALL ] { <query_specification> | ( <query_expression> ) } [ …n ] }
Argumente
<query_specification> | ( <query_expression> )
ist eine Abfrage-Spezifikation oder Abfrage-Ausdruck, der Daten zurückgibt, die mit den Daten einer anderen Abfrage-Spezifikation oder eines anderen Abfrage-Ausdrucks kombiniert werden sollen. Die Definitionen der Spalten, die Teil einer UNION-Operation sind, müssen nicht identisch sein, sie müssen jedoch über eine implizite Konvertierung kompatibel sein. Wenn sich die Datentypen unterscheiden, wird der resultierende Datentyp auf Grundlage der Regeln für die Datentyp-Reihenfolge bestimmt. Wenn die Datentypen identisch sind, sich jedoch in Präzision, Skala oder Länge unterscheiden, wird das Ergebnis auf Grundlage der Regeln für die Kombination von Ausdrücken bestimmt. Weitere Informationen findest du unter Präzision, Skala und Länge (Transact-SQL).
Spalten vom Typ xml
müssen identisch sein. Alle Spalten müssen entweder einem XML-Schema zugeordnet oder untypisiert sein. Wenn sie einem Schema zugeordnet sind, müssen sie demselben XML-Schema-Collection-Typ zugeordnet sein.
UNION gibt an, dass mehrere Ergebnismengen kombiniert und als eine einzelne Ergebnismenge zurückgegeben werden sollen.
ALL fügt alle Zeilen in die Ergebnisse ein, einschließlich Duplikate. Wenn nicht angegeben, werden doppelte Zeilen entfernt.
Beispiele
A. Verwendung einer einfachen UNION
Im folgenden Beispiel werden die Inhalte der Spalten ProductModelID
und Name
sowohl der Tabellen ProductModel
als auch Gloves
in einem Ergebnissatz kombiniert.
-- Verwendung von AdventureWorks
IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL
DROP TABLE dbo.Gloves;
GO
-- Erstellen der Gloves-Tabelle.
SELECT ProductModelID, Name INTO dbo.Gloves
FROM Production.ProductModel
WHERE ProductModelID IN (3, 4);
GO
-- Hier ist die einfache UNION.
-- Verwendung von 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. Verwendung von SELECT INTO mit UNION
Im folgenden Beispiel gibt die INTO-Klausel im zweiten SELECT-Statement an, dass die Tabelle ProductResults
das Endergebnis der Kombination der ausgewählten Spalten der Tabellen ProductModel
und Gloves
enthält. Die Tabelle Gloves
wird im ersten SELECT-Statement erstellt.
-- Verwendung von 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
-- Erstellen der Gloves-Tabelle.
SELECT ProductModelID, Name INTO dbo.Gloves
FROM Production.ProductModel
WHERE ProductModelID IN (3, 4);
GO
-- Verwendung von 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. Verwendung von UNION von zwei SELECT-Statements mit ORDER BY
Die Reihenfolge bestimmter Parameter, die mit der UNION-Klausel verwendet werden, ist wichtig. Das folgende Beispiel zeigt die falsche und richtige Verwendung von UNION in zwei SELECT-Statements, in denen eine Spalte in der Ausgabe umbenannt werden soll.
-- Verwendung von AdventureWorks
IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL
DROP TABLE dbo.Gloves;
GO
-- Erstellen der Gloves-Tabelle.
SELECT ProductModelID, Name INTO dbo.Gloves
FROM Production.ProductModel
WHERE ProductModelID IN (3, 4);
GO
/* FALSCH */
-- Verwendung von AdventureWorks
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
ORDER BY Name
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves;
GO
/* RICHTIG */
-- Verwendung von 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. Verwendung von UNION von drei SELECT-Statements zur Darstellung der Auswirkungen von ALL und Klammern
Die folgenden Beispiele verwenden UNION, um die Ergebnisse von drei Tabellen zu kombinieren, die alle die gleichen 5 Zeilen Daten enthalten. Das erste Beispiel verwendet UNION ALL, um die duplizierten Datensätze anzuzeigen und gibt alle 15 Zeilen zurück. Das zweite Beispiel verwendet UNION ohne ALL, um die doppelten Zeilen aus den kombinierten Ergebnissen der drei SELECT-Statements zu entfernen und gibt 5 Zeilen zurück.
Das dritte Beispiel verwendet ALL mit der ersten UNION und die Klammern umschließen die zweite UNION, die nicht ALL verwendet. Die zweite UNION wird zuerst verarbeitet, da sie in Klammern steht, und gibt 5 Zeilen zurück, da die ALL-Option nicht verwendet wird und die Duplikate entfernt werden. Diese 5 Zeilen werden mit den Ergebnissen des ersten SELECT durch die Verwendung der UNION ALL-Schlüsselwörter kombiniert. In diesem Beispiel werden die Duplikate zwischen den beiden Gruppen von fünf Zeilen nicht entfernt. Das Endergebnis enthält 10 Zeilen.
-- Verwendung von 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
Beispiele: Azure Synapse Analytics und Analytics Platform System (PDW)
E. Verwendung einer einfachen UNION
Im folgenden Beispiel enthält der Ergebnissatz den Inhalt der CustomerKey
-Spalten sowohl der Tabellen FactInternetSales
als auch DimCustomer
. Da das ALL-Schlüsselwort nicht verwendet wird, werden Duplikate aus den Ergebnissen ausgeschlossen.
-- Verwendung von AdventureWorks
SELECT CustomerKey
FROM FactInternetSales
UNION
SELECT CustomerKey
FROM DimCustomer
ORDER BY CustomerKey;
F. Verwendung von UNION von zwei SELECT-Statements mit ORDER BY
Wenn in einem UNION-Statement eine SELECT-Anweisung eine ORDER BY-Klausel enthält, sollte diese Klausel nach allen SELECT-Anweisungen platziert werden. Das folgende Beispiel zeigt die falsche und richtige Verwendung von UNION in zwei SELECT-Statements, in denen eine Spalte mit ORDER BY sortiert wird.
-- Verwendung von AdventureWorks
-- FALSCH
SELECT CustomerKey
FROM FactInternetSales
ORDER BY CustomerKey
UNION
SELECT CustomerKey
FROM DimCustomer
ORDER BY CustomerKey;
-- RICHTIG
-- Verwendung von AdventureWorksPDW2012;
SELECT CustomerKey
FROM FactInternetSales
UNION
SELECT CustomerKey
FROM DimCustomer
ORDER BY CustomerKey;
G. Verwendung von UNION von zwei SELECT-Statements mit WHERE und ORDER BY
Das folgende Beispiel zeigt die falsche und richtige Verwendung von UNION in zwei SELECT-Statements, in denen WHERE und ORDER BY benötigt werden.
-- Verwendung von AdventureWorks
-- FALSCH
SELECT CustomerKey
FROM FactInternetSales
WHERE CustomerKey >= 11000
ORDER BY CustomerKey
UNION
SELECT CustomerKey
FROM DimCustomer
ORDER BY CustomerKey;
-- RICHTIG
-- Verwendung von AdventureWorksPDW2012;
SELECT CustomerKey
FROM FactInternetSales
WHERE CustomerKey >= 11000
UNION
SELECT CustomerKey
FROM DimCustomer
ORDER BY CustomerKey;
H. Verwendung von UNION von drei SELECT-Statements zur Darstellung der Auswirkungen von ALL und Klammern
Die folgenden Beispiele verwenden UNION, um die Ergebnisse derselben Tabelle zu kombinieren und die Auswirkungen von ALL und Klammern zu demonstrieren.
Das erste Beispiel verwendet UNION ALL, um die duplizierten Datensätze anzuzeigen und gibt jede Zeile in der Quelltabelle dreimal zurück. Das zweite Beispiel verwendet UNION ohne ALL, um die doppelten Zeilen aus den kombinierten Ergebnissen der drei SELECT-Statements zu entfernen und gibt nur die unduplizierten Zeilen aus der Quelltabelle zurück.
Das dritte Beispiel verwendet ALL mit der ersten UNION und die Klammern umschließen die zweite UNION, die nicht ALL verwendet. Die zweite UNION wird zuerst verarbeitet, da sie in Klammern steht. Sie gibt nur die unduplizierten Zeilen aus der Tabelle zurück, da die ALL-Option nicht verwendet wird und die Duplikate entfernt werden. Diese Zeilen werden mit den Ergebnissen des ersten SELECT durch die Verwendung der UNION ALL-Schlüsselwörter kombiniert. Dieses Beispiel entfernt die Duplikate zwischen den beiden Gruppen von fünf Zeilen nicht. Das Endergebnis enthält 10 Zeilen.
-- Verwendung von 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
);