Suche…


Einführung

Das UNION- Schlüsselwort in SQL wird verwendet, um die SELECT- Anweisungsergebnisse ohne Duplikat zu kombinieren. Um UNION zu verwenden und Ergebnisse zu kombinieren, sollten beide SELECT-Anweisungen dieselbe Spaltenanzahl mit demselben Datentyp in derselben Reihenfolge aufweisen. Die Spaltenlänge kann jedoch unterschiedlich sein.

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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow