SQL
UNION / UNION ALL
Suche…
Einführung
Syntax
- SELECT Spalte_1 [, Spalte_2] FROM Tabelle_1 [, Tabelle_2] [WHERE-Bedingung]
UNION | UNION ALL
SELECT Spalte_1 [, Spalte_2] FROM Tabelle_1 [, Tabelle_2] [WHERE-Bedingung]
Bemerkungen
UNION
und UNION ALL
Klauseln kombinieren die Ergebnismenge von zwei oder mehr identisch aufgebauten SELECT-Anweisungen in einem einzigen Ergebnis / einer einzigen Tabelle.
Sowohl die Spaltenanzahl als auch die Spaltentypen für jede Abfrage müssen übereinstimmen, damit UNION
/ UNION ALL
funktionieren kann.
Der Unterschied zwischen einer UNION
und einer UNION ALL
Abfrage besteht darin, dass mit der UNION
Klausel doppelte Zeilen im Ergebnis entfernt werden, in denen die UNION ALL
nicht UNION ALL
.
Durch das eindeutige Entfernen von Datensätzen können Abfragen erheblich verlangsamt werden, selbst wenn keine separaten Zeilen entfernt werden müssen, wenn Sie wissen, dass es keine Duplikate gibt (oder egal,), die für eine optimierte Abfrage immer auf UNION ALL
.
Grundlegende UNION ALL-Abfrage
CREATE TABLE HR_EMPLOYEES
(
PersonID int,
LastName VARCHAR(30),
FirstName VARCHAR(30),
Position VARCHAR(30)
);
CREATE TABLE FINANCE_EMPLOYEES
(
PersonID INT,
LastName VARCHAR(30),
FirstName VARCHAR(30),
Position VARCHAR(30)
);
Angenommen, wir möchten die Namen aller managers
aus unseren Abteilungen extrahieren.
Mit einer UNION
wir alle Mitarbeiter sowohl aus der Personalabteilung als auch aus der Finanzabteilung beziehen, die die position
eines manager
position
SELECT
FirstName, LastName
FROM
HR_EMPLOYEES
WHERE
Position = 'manager'
UNION ALL
SELECT
FirstName, LastName
FROM
FINANCE_EMPLOYEES
WHERE
Position = 'manager'
Die UNION
Anweisung entfernt doppelte Zeilen aus den Abfrageergebnissen. Da es in beiden Abteilungen möglich ist, Personen mit demselben Namen und derselben Position zu haben, verwenden wir UNION ALL
, um Doppeleinträge nicht zu entfernen.
Wenn Sie für jede Ausgabespalte einen Alias verwenden möchten, können Sie sie wie folgt in die erste select-Anweisung einfügen:
SELECT
FirstName as 'First Name', LastName as 'Last Name'
FROM
HR_EMPLOYEES
WHERE
Position = 'manager'
UNION ALL
SELECT
FirstName, LastName
FROM
FINANCE_EMPLOYEES
WHERE
Position = 'manager'
Einfache Erklärung und Beispiel
In einfachen Worten:
-
UNION
verbindet 2 Ergebnissätze und entfernt Duplikate aus dem Ergebnissatz -
UNION ALL
verbindet 2 Ergebnissätze, ohne zu versuchen, Duplikate zu entfernen
Ein Fehler, den viele Leute machen, ist die Verwendung einer
UNION
wenn die Duplikate nicht entfernt werden müssen. Die zusätzlichen Leistungskosten bei großen Ergebnismengen können sehr hoch sein.
Wenn Sie UNION
brauchen
Angenommen, Sie müssen eine Tabelle nach zwei verschiedenen Attributen filtern, und Sie haben für jede Spalte separate, nicht gruppierte Indizes erstellt. Mit einer UNION
können Sie beide Indizes nutzen und trotzdem Duplikate vermeiden.
SELECT C1, C2, C3 FROM Table1 WHERE C1 = @Param1
UNION
SELECT C1, C2, C3 FROM Table1 WHERE C2 = @Param2
Dies vereinfacht die Leistungsoptimierung, da nur einfache Indizes erforderlich sind, um diese Abfragen optimal auszuführen. Sie können sogar mit etwas weniger nicht gruppierten Indizes auskommen, was die allgemeine Schreibleistung auch gegenüber der Quelltabelle verbessert.
Wenn Sie UNION ALL
brauchen
Angenommen, Sie müssen immer noch eine Tabelle nach zwei Attributen filtern, aber Sie müssen keine doppelten Datensätze filtern (entweder, weil dies unwichtig ist oder Ihre Daten während der Vereinigung aufgrund Ihres Datenmodellentwurfs keine Duplikate erzeugen würden).
SELECT C1 FROM Table1
UNION ALL
SELECT C1 FROM Table2
Dies ist besonders nützlich, wenn Sie Ansichten erstellen, die Daten verknüpfen, die physisch über mehrere Tabellen hinweg partitioniert werden sollen (möglicherweise aus Leistungsgründen, aber dennoch Datensätze aufrollen). Da die Daten bereits aufgeteilt sind, fügt das Entfernen von Duplikaten durch die Datenbank-Engine keinen Wert hinzu und erhöht lediglich die Verarbeitungszeit für die Abfragen.