Mengenoperatoren

Mengenoperatoren ermöglichen das Kombinieren von Abfragen.

Unter diesem Thema:

Allgemeine Syntax

[ ( ] <query> [ ) ] { INTERSECT | { MINUS | EXCEPT } | UNION [ ALL ] } [ ( ] <query> [ ) ]
[ ORDER BY ... ]
[ LIMIT ... ]
Copy

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;
      
      Copy

      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;
      
      Copy

      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;
      
      Copy

      so, als lautete sie:

      SELECT LastName, FirstName FROM employees
      UNION ALL
      SELECT FirstName AS LastName, LastName AS FirstName FROM contractors;
      
      Copy
  • 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).

    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 ...
Copy

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 ...
Copy

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 ...
Copy

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);
Copy

Führen Sie eine UNION-Operation mit verschiedenen Datentypen aus:

SELECT v FROM t1    -- VARCHAR
UNION
SELECT i FROM t2    -- INTEGER
;
Copy

Ausgabe:

100038 (22018): Numeric value 'Adams, Douglas' is not recognized
Copy

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;
Copy

Ausgabe:

+----------------+
| V::VARCHAR     |
|----------------|
| Adams, Douglas |
| 42             |
+----------------+
Copy