In SQL die UNION
-Klausel verkettet die Ergebnisse zweier Abfragen zu einer einzigen Ergebnismenge.
Sie können die UNION
verwenden -Klausel mit oder ohne ALL
Argument:
UNION ALL
– Enthält Duplikate.UNION
– Schließt Duplikate aus.
Nachfolgend finden Sie einige grundlegende Beispiele, um zu demonstrieren, wie es funktioniert.
Beispieltabellen
Angenommen, wir haben zwei Tabellen:Cats
und Dogs
Cats
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Dogs
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | | 1002 | Fetch | +---------+-----------+
Wir können ein SELECT
verwenden Anweisung mit einer UNION
-Klausel, um die Ergebnisse aus beiden Tabellen in einer Ergebnismenge zu kombinieren.
Beispiel mit UNION ALL
Lassen Sie uns zuerst UNION ALL
verwenden damit es Duplikate enthält.
SELECT DogName AS PetName
FROM Dogs
UNION ALL
SELECT CatName
FROM Cats;
Ergebnis:
+-----------+ | PetName | |-----------| | Fetch | | Fluffy | | Wag | | Fetch | | Meow | | Fluffy | | Scratch | +-----------+ (7 rows affected)
In diesem Fall werden sieben Zeilen zurückgegeben. Wir können sehen, dass „Fetch“ zweimal zurückgegeben wird. Das liegt daran, dass es zwei Hunde namens Fetch gibt.
Es gibt auch eine Katze und einen Hund mit demselben Namen:Fluffy.
Beachten Sie, dass ich einen Spaltenalias verwendet habe, um das von der Operation zurückgegebene Feld zu benennen. Wenn ich das nicht getan hätte, hätte das Ergebnis die Spaltennamen aus der ersten Abfrage verwendet. In diesem Fall hätte die Spaltenüberschrift DogName
heißen müssen statt PetName
.
SELECT DogName
FROM Dogs
UNION ALL
SELECT CatName
FROM Cats;
Ergebnis:
+-----------+ | DogName | |-----------| | Fetch | | Fluffy | | Wag | | Fetch | | Meow | | Fluffy | | Scratch | +-----------+ (7 rows affected)
Abhängig von den Daten, die Sie in Ihrer Abfrage zurückgeben, kann dies akzeptabel sein oder nicht. In unserem Fall ist es nicht angemessen, da nicht alle Ergebnisse Hunde sind.
Beispiel mit UNION
Mal sehen, was passiert, wenn wir ALL
entfernen Argument.
SELECT DogName AS PetName
FROM Dogs
UNION
SELECT CatName
FROM Cats;
Ergebnis:
+-----------+ | PetName | |-----------| | Fetch | | Fluffy | | Meow | | Scratch | | Wag | +-----------+ (5 rows affected)
Diesmal werden nur fünf Zeilen zurückgegeben. Beide Duplikate werden entfernt.
UNION
vs DISTINCT
Beachten Sie, dass sich dies von der Anwendung von DISTINCT
unterscheidet zu jedem einzelnen SELECT
Erklärung. Wenn wir das getan hätten, wäre Fluffy zweimal zurückgegeben worden, weil die ALL
würde nur für SELECT
gelten Aussage, gegen die es angewendet wird (nicht auf die verketteten Ergebnisse).
Hier ist ein Beispiel, um zu veranschaulichen, was ich meine.
SELECT DISTINCT DogName AS PetName
FROM Dogs
UNION ALL
SELECT DISTINCT CatName
FROM Cats;
Ergebnis:
+-----------+ | PetName | |-----------| | Fetch | | Fluffy | | Wag | | Fluffy | | Meow | | Scratch | +-----------+ (6 rows affected)
Alle Abfragen müssen die gleiche Anzahl von Spalten zurückgeben
Wenn Sie die UNION
verwenden -Klausel muss jede Abfrage die gleiche Anzahl von Spalten haben und sie müssen in der gleichen Reihenfolge sein.
Andernfalls erhalten Sie eine Fehlermeldung.
SELECT CatName FROM Cats
UNION ALL
SELECT DogId, DogName FROM Dogs;
Ergebnis:
Msg 205, Level 16, State 1, Line 1 All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.
Das ist der Fehler, den SQL Server zurückgibt, wenn eine ungleiche Anzahl von Spalten verwendet wird. Dieser spezielle Fehler weist darauf hin, dass die gleiche Einschränkung auch für INTERSECT
gilt und EXCEPT
Betreiber. Die Fehlermeldung, die Sie erhalten, kann je nach DBMS unterschiedlich sein.
Datentypen müssen kompatibel sein
Zusätzlich zur erforderlichen Anzahl von Spalten müssen diese Spalten einen kompatiblen Datentyp haben.
Sie müssen nicht unbedingt vom gleichen Datentyp sein, aber sie müssen kompatibel sein. Das heißt, sie müssen durch implizite Konvertierung kompatibel sein. Wenn die Datentypen nicht übereinstimmen, muss das DBMS in der Lage sein, eine implizite Konvertierung durchzuführen, damit sie übereinstimmen.
Andernfalls erhalten Sie eine Fehlermeldung.
SELECT CatName FROM Cats
UNION ALL
SELECT DogId FROM Dogs;
Ergebnis:
Msg 245, Level 16, State 1, Line 1 Conversion failed when converting the varchar value 'Meow' to data type int.
Ordnen der Ergebnisse
Wenn Sie die Ergebnisse mit dem ORDER BY
sortieren möchten -Klausel müssen Sie sie in die letzte Abfrage einfügen. Sie können keinen separaten ORDER BY
angeben -Klausel für jede Abfrage oder für jede Abfrage, die nicht die letzte ist.
Hier ist der Fehler, den ich bekomme, wenn ich das in SQL Server versuche:
SELECT DogName AS PetName
FROM Dogs
ORDER BY DogName
UNION ALL
SELECT CatName
FROM Cats;
Ergebnis:
Msg 156, Level 15, State 1, Line 4 Incorrect syntax near the keyword 'UNION'.
Wenn wir die Ergebnisse ordnen möchten, müssen wir daher etwa so vorgehen:
SELECT DogName AS PetName
FROM Dogs
UNION ALL
SELECT CatName
FROM Cats
ORDER BY PetName;
Anwenden von UNION
zu den mehr als zwei Abfragen
Die vorherigen Beispiele kombinierten Ergebnisse aus zwei verschiedenen Abfragen, aber nichts hindert Sie daran, weitere hinzuzufügen. Sie können damit bei Bedarf die Ergebnisse vieler Abfragen kombinieren.
Zum Beispiel, wenn wir auch einen Birds
hätten Tabelle, könnten wir dies tun:
SELECT DogName AS PetName
FROM Dogs
UNION ALL
SELECT CatName
FROM Cats
UNION ALL
SELECT BirdName
FROM Birds;
Normalisierung
Die Beispiele auf dieser Seite setzen Katzen und Hunde in zwei separate Tabellen. Der Grund, warum ich das getan habe, ist, dass es eine klare und prägnante Art ist, zu veranschaulichen, wie UNION
funktioniert.
In der Praxis könnten Sie diese in derselben Tabelle namens Pets
haben , haben dann separate PetTypes
Tisch (oder ähnliches). Dies wird als Normalisierung bezeichnet und ist die Art und Weise, wie relationale Datenbanken normalerweise entworfen werden.
Sie könnten dann einen Join für diese Tabellen ausführen, um die erforderlichen Daten zurückzugeben.