Mengenoperatoren¶
Mengenoperatoren ermöglichen das Kombinieren von Abfragen.
Unter diesem Thema:
Allgemeine Syntax¶
[ ( ] <query> [ ) ] { INTERSECT | { MINUS | EXCEPT } | UNION [ ALL ] } [ ( ] <query> [ ) ]
[ ORDER BY ... ]
[ LIMIT ... ]
Allgemeine Nutzungshinweise¶
Jede Abfrage kann selbst Abfrageoperatoren enthalten, damit sich beliebig viele Abfrageausdrücke mit Mengenoperatoren kombinieren lassen.
Die Klauseln ORDER BY und LIMIT / FETCH werden auf das Ergebnis des Mengenoperators angewendet.
Bei Verwendung dieser Operatoren:
Stellen Sie sicher, dass für jede Abfrage die gleiche Anzahl von Spalten ausgewählt ist.
Stellen Sie sicher, dass die Datentypen der einzelnen Spalten in allen Zeilen der verschiedenen Quellen konsistent sind. Eines der Beispiele im Abschnitt Beispiele veranschaulicht das mögliche Problem und die entsprechende Lösung, wenn Datentypen nicht übereinstimmen.
Im Allgemeinen sollten die „Bedeutungen“ sowie die Datentypen der Spalten übereinstimmen. Folgendes führt nicht zu den gewünschten Ergebnissen:
SELECT LastName, FirstName FROM employees UNION ALL SELECT FirstName, LastName FROM contractors;
Das Fehlerrisiko erhöht sich, wenn mit dem Sternchen alle Spalten einer Tabelle ausgewählt werden. Beispiel:
SELECT * FROM table1 UNION ALL SELECT * FROM table2;
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.
Die Namen der Ausgabespalten basieren auf den Namen der Spalten der ersten Abfrage. Beispielsweise verhält sich die folgende Abfrage
SELECT LastName, FirstName FROM employees UNION ALL SELECT FirstName, LastName FROM contractors;
so, als lautete sie:
SELECT LastName, FirstName FROM employees UNION ALL SELECT FirstName AS LastName, LastName AS FirstName FROM contractors;
Die Rangfolge der Mengenoperatoren entspricht den ANSI- und ISO SQL-Standards:
Die Operatoren
UNION [ALL]
undMINUS
(EXCEPT
) haben die gleiche Priorität.Der Operator
INTERSECT
hat Vorrang vorUNION [ALL]
undMINUS
(EXCEPT
).
Operatoren gleicher Priorität werden von links nach rechts verarbeitet.
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.
INTERSECT¶
Gibt Zeilen mit Duplikatlöschung aus dem Resultset einer Abfrage zurück, die auch im Resultset einer anderen Abfrage erscheinen.
Syntax¶
SELECT ...
INTERSECT
SELECT ...
MINUS , EXCEPT¶
Entfernt Zeilen aus dem Resultset einer Abfrage, die im Resultset einer anderen Abfrage erscheinen, durch Duplikatlöschung.
Die Schlüsselwörter MINUS und EXCEPT haben dieselbe Bedeutung und können austauschbar verwendet werden.
Syntax¶
SELECT ...
MINUS
SELECT ...
SELECT ...
EXCEPT
SELECT ...
UNION [ ALL ]¶
Kombiniert die Resultsets aus zwei Abfragen:
UNION kombiniert mit doppelter Löschung.
UNION ALL kombiniert ohne doppelte Löschung.
Der Standardwert ist UNION (d. h. Löschen von Duplikaten).
Syntax¶
SELECT ...
UNION [ ALL ]
SELECT ...
Beispiele¶
In diesem Beispiel wird die grundlegende Verwendung des Operators UNION veranschaulicht. Es zeigt auch ein mögliches Problem, wenn Datentypen nicht übereinstimmen, und bietet dann die Lösung.
Erstellen Sie zunächst die Tabellen, und fügen Sie einige Daten ein:
CREATE TABLE t1 (v VARCHAR); CREATE TABLE t2 (i INTEGER); INSERT INTO t1 (v) VALUES ('Adams, Douglas'); INSERT INTO t2 (i) VALUES (42);
Führen Sie eine UNION-Operation mit verschiedenen Datentypen aus:
SELECT v FROM t1 -- VARCHAR UNION SELECT i FROM t2 -- INTEGER ;Ausgabe:
100038 (22018): Numeric value 'Adams, Douglas' is not recognized
Verwenden Sie jetzt die explizite Umwandlung, um die Eingaben in einen kompatiblen Typ zu konvertieren:
SELECT v::VARCHAR FROM t1 UNION SELECT i::VARCHAR FROM t2;Ausgabe:
+----------------+ | V::VARCHAR | |----------------| | Adams, Douglas | | 42 | +----------------+