Mengenoperatoren¶
Set-Operatoren fassen die Zwischenergebnisse mehrerer Abfrageblöcke zu einem einzigen Resultset zusammen.
Allgemeine Syntax¶
Allgemeine Nutzungshinweise¶
Jede Abfrage kann selbst Abfrageoperatoren enthalten, sodass Sie mehrere Abfrageausdrücke mit Mengenoperatoren kombinieren können.
Sie können die ORDER BY- und LIMIT / FETCH-Klauseln auf das Ergebnis des Mengenoperators anwenden.
Bei Verwendung dieser Operatoren:
Stellen Sie sicher, dass für jede Abfrage die gleiche Anzahl von Spalten ausgewählt wird, mit Ausnahme von Abfragen, die UNION BY NAME oder UNION ALL BY NAME enthalten.
Stellen Sie sicher, dass die Datentypen der einzelnen Spalten in allen Zeilen der verschiedenen Quellen konsistent sind. Eines der Beispiele im Abschnitt Verwenden Sie den UNION-Operator und wandeln Sie nicht übereinstimmende Datentypen um veranschaulicht das mögliche Problem und die Lösung, wenn die Datentypen nicht übereinstimmen.
Stellen Sie generell sicher, dass die „Bedeutungen“ sowie die Datentypen der Spalten übereinstimmen. Die folgende Abfrage mit dem UNION ALL-Operator führt nicht zu den gewünschten Ergebnissen:
Das Fehlerrisiko erhöht sich, wenn Sie ein Sternchen verwenden, um alle Spalten einer Tabelle auszuwählen. Beispiel:
Wenn die Anzahl der Spalten in den Tabellen gleich ist, die Spalten jedoch nicht in derselben Reihenfolge angeordnet sind, werden die Abfrageergebnisse wahrscheinlich fehlerhaft ausfallen, wenn Sie diese Operatoren verwenden.
Die UNION BY NAME- und UNION ALL BY NAME-Operatoren sind Ausnahmen für dieses Szenario. Beispielsweise gibt die folgende Abfrage die richtigen Werte zurück:
Die Namen der Ausgabespalten basieren auf den Namen der Spalten der ersten Abfrage. Betrachten wir beispielsweise die folgende Abfrage:
Diese Abfrage verhält sich, als wäre die Abfrage wie folgt:
Die Rangfolge der Mengenoperatoren entspricht den ANSI- und ISO SQL-Standards:
Die Operatoren UNION [ALL] und MINUS (EXCEPT) haben die gleiche Priorität.
Der Operator INTERSECT hat Vorrang vor UNION [ALL] und MINUS (EXCEPT).
Snowflake verarbeitet Operatoren gleicher Priorität von links nach rechts.
Sie können Klammern verwenden, um das Auswerten der Ausdrücke in einer anderen Reihenfolge zu erzwingen.
Nicht alle Datenbankanbieter folgen dem ANSI/ISO-Standard für die Rangfolge von Mengenoperatoren. Snowflake empfiehlt die Verwendung von Klammern zur Angabe der Auswertungsreihenfolge, insbesondere wenn Sie Code von einem anderen Anbieter in Snowflake portieren oder Code schreiben, den Sie möglicherweise auf anderen Datenbanken oder auf Snowflake ausführen.
Beispieltabellen für Beispiele¶
Für einige der Beispiele in diesem Thema werden die folgenden Beispieltabellen verwendet. Beide Tabellen haben eine Spalte für Postleitzahlen. In einer Tabelle wird die Postleitzahl jedes Verkaufsbüros erfasst, in der anderen die Postleitzahl jedes Kunden.
INTERSECT¶
Gibt Zeilen mit Duplikatlöschung aus dem Resultset einer Abfrage zurück, die auch im Resultset einer anderen Abfrage erscheinen.
Syntax¶
Beispiele zum INTERSECT-Operator¶
Um die Postleitzahlen zu finden, die sich sowohl in der sales_office_postal_example-Tabelle als auch in der customer_postal_example-Tabelle befinden, fragen Sie die Beispieltabellen ab:
MINUS , EXCEPT¶
Gibt die von der ersten Abfrage zurückgegebenen Zeilen zurück, die nicht auch von der zweiten Abfrage zurückgegeben werden.
Die Schlüsselwörter MINUS und EXCEPT haben dieselbe Bedeutung und können austauschbar verwendet werden.
Syntax¶
Beispiele zum MINUS-Operator¶
Fragen Sie die Beispieltabellen ab, um die Postleitzahlen in der sales_office_postal_example-Tabelle zu finden, die nicht auch in der customer_postal_example-Tabelle enthalten sind:
Fragen Sie die Beispieltabellen ab, um die Postleitzahlen in der customer_postal_example-Tabelle zu finden, die nicht auch in der sales_office_postal_example-Tabelle enthalten sind:
UNION [ { DISTINCT | ALL } ] [ BY NAME ]¶
Kombiniert die Resultsets aus zwei Abfragen:
UNION [ DISTINCT ] kombiniert Zeilen nach Spaltenposition mit Löschung von Duplikaten.
UNION ALL kombiniert Zeilen nach Spaltenposition ohne Löschung von Duplikaten.
UNION [ DISTINCT ] BY NAME kombiniert Zeilen nach Spaltenname mit Löschung von Duplikaten.
UNION ALL BY NAME kombiniert Zeilen nach Spaltenname ohne Löschung von Duplikaten.
Der Standardwert ist UNION DISTINCT (d. h. Kombinieren von Zeilen nach Spaltenposition mit Löschung von Duplikaten). Das Schlüsselwort DISTINCT ist optional. Das Schlüsselwort DISTINCT und das Schlüsselwort ALL schließen sich gegenseitig aus.
Verwenden Sie UNION oder UNION ALL, wenn die Spaltenpositionen in den Tabellen, die Sie kombinieren, übereinstimmen. Verwenden Sie UNION BY NAME oder UNION ALL BY NAME für die folgenden Anwendungsfälle:
Die Tabellen, die Sie kombinieren, haben unterschiedliche Spaltenreihenfolgen.
Die Tabellen, die Sie kombinieren, haben sich weiterentwickelnde Schemas, in denen Spalten hinzugefügt oder neu angeordnet werden.
Sie möchten Teilmengen von Spalten kombinieren, die unterschiedliche Positionen in den Tabellen haben.
Syntax¶
Nutzungshinweise für die BY NAME-Klausel¶
Zusätzlich zu den :ref:`Allgemeinen Nutzungshinweisen <label-operators_query_general_usage_notes>`gelten die folgenden Nutzungshinweise auch für UNION BY NAME und UNION ALL BY NAME:
Spalten mit den gleichen Bezeichnern werden abgeglichen und miteinander kombiniert. Beim Abgleich von Bezeichnern ohne Anführungszeichen wird zwischen Groß- und Kleinschreibung unterschieden, und beim Abgleich von Bezeichnern in Anführungszeichen wird die Groß- und Kleinschreibung berücksichtigt.
Die Eingaben müssen nicht die gleiche Anzahl von Spalten haben. Wenn eine Spalte in der einen Eingabe vorhanden ist, jedoch nicht in der anderen, wird sie im kombinierten Resultset für jede Zeile, in der sie fehlt, mit NULL-Werten ausgefüllt.
Die Reihenfolge der Spalten im kombinierten Resultset wird durch die Reihenfolge der eindeutigen Spalten von links nach rechts nach ihrem ersten Auftreten bestimmt.
Beispiele zum UNION-Operator¶
In den folgenden Beispielen wird der UNION-Operator verwendet:
Kombinieren der Ergebnisse aus zwei Abfragen nach Spaltenposition
Kombinieren der Ergebnisse aus zwei Abfragen nach Spaltenname
Verwenden Sie den UNION-Operator und wandeln Sie nicht übereinstimmende Datentypen um
Kombinieren der Ergebnisse aus zwei Abfragen nach Spaltenposition¶
Zum Kombinieren der Resultsets nach Spaltenposition aus zwei Abfragen in den Beispieltabellen verwenden Sie den UNION-Operator:
Kombinieren der Ergebnisse aus zwei Abfragen nach Spaltenname¶
Erstellen Sie zwei Tabellen mit unterschiedlicher Spaltenreihenfolge und fügen Sie Daten ein:
Zum Kombinieren der Resultsets nach Spaltenname aus zwei Abfragen verwenden Sie den UNION BY NAME-Operator:
Die Ausgabe zeigt, dass die Abfrage die doppelte Zeile (mit 3 in Spalte A und three in Spalte B) gelöscht hat.
Zum Kombinieren der Tabellen ohne Löschung von Duplikaten verwenden Sie den UNION ALL BY NAME -Operator:
Beachten Sie, dass die Groß-/Kleinschreibung der Spaltennamen in den beiden Tabellen nicht übereinstimmt. Die Spaltennamen sind in der union_demo_column_order1-Tabelle in Kleinbuchstaben und in der union_demo_column_order2-Tabelle in Großbuchstaben geschrieben. Wenn Sie eine Abfrage ausführen, bei der Spaltennamen in Anführungszeichen stehen, wird ein Fehler zurückgegeben, da beim Abgleich von Bezeichnern in Anführungszeichen die Groß-/Kleinschreibung beachtet wird. In der folgenden Abfrage werden die Spaltennamen beispielsweise in Anführungszeichen gesetzt:
Verwenden Sie einen Alias, um die Ergebnisse aus zwei Abfragen mit unterschiedlichen Spaltennamen miteinander zu kombinieren¶
Wenn Sie den UNION BY NAME-Operator verwenden, um die Resultsets nach Spaltennamen aus zwei Abfragen in den -Beispieltabellen miteinander zu kombinieren, erhalten die Zeilen im Resultset NULL-Werte, da die Spaltennamen nicht übereinstimmen:
Die Ausgabe zeigt, dass Spalten mit unterschiedlichen Bezeichnern nicht kombiniert werden und dass Zeilen NULL-Werte für Spalten haben, die in der einen Tabelle vorhanden sind, aber nicht in der anderen. Die postal_code-Spalte ist in beiden Tabellen vorhanden, sodass es keine NULL-Werte in der Ausgabe für die postal_code-Spalte gibt.
Die folgende Abfrage verwendet den Alias office_or_customer, sodass Spalten mit unterschiedlichen Namen für die Dauer der Abfrage denselben Namen haben:
Verwenden Sie den UNION-Operator und wandeln Sie nicht übereinstimmende Datentypen um¶
Dieses Beispiel veranschaulicht ein mögliches Problem bei der Verwendung des UNION-Operators, wenn die Datentypen nicht übereinstimmen, und bietet dann die Lösung.
Erstellen Sie zunächst die Tabellen, und fügen Sie einige Daten ein:
Führen Sie eine „UNION nach Spaltenposition“-Operation mit verschiedenen Datentypen aus (ein VARCHAR-Wert in union_test1 und ein INTEGER-Wert in union_test2):
Diese Abfrage gibt einen Fehler zurück:
Verwenden Sie jetzt die explizite Umwandlung, um die Eingaben in einen kompatiblen Typ zu konvertieren: