Kombinieren von Resultsets mit UNION

Der UNION-Operator ermöglicht es Ihnen, die Ergebnisse von zwei oder mehr SELECT-Anweisungen zu einem einzigen Resultset zusammenzufassen. Die mithilfe von UNION kombinierten Resultsets müssen alle dieselbe Struktur aufweisen. Sie müssen über dieselbe Anzahl an Spalten verfügen, und die einander entsprechenden Resultsetspalten müssen kompatible Datentypen aufweisen. Weitere Informationen finden Sie unter Richtlinien für das Verwenden von UNION-Operatoren.

UNION wird wie folgt angegeben:

select_statement UNION [ALL] select_statement

Table1 und Table2 weisen beispielsweise dieselbe zweispaltige Struktur auf.

TABLE1

 

 

TABLE2

 

COLUMNA

COLUMNB

 

COLUMNC

COLUMND

CHAR(4)

INT

 

CHAR(4)

INT

-------

---

 

-------

---

ABC

  1

 

GHI

  3

DEF

  2

 

JKL

  4

GHI

  3

 

MNO

  5

Mit dieser Abfrage wird eine UNION-Operation für die Tabellen erstellt:

SELECT * FROM Table1
UNION
SELECT * FROM Table2

Im Folgenden wird das Resultset aufgeführt:

ColumnA  ColumnB
-------  --------
abc      1
def      2
ghi      3
jkl      4
mno      5

Die Spaltennamen im Resultset einer UNION-Anweisung sind mit den Spaltennamen im Resultset der ersten SELECT-Anweisung in der UNION-Anweisung identisch. Die Spaltennamen im Resultset der anderen SELECT-Anweisungen werden ignoriert.

Der UNION-Operator entfernt standardmäßig doppelte Zeilen aus dem Resultset. Verwenden Sie ALL, wenn alle Zeilen in die Ergebnisse aufgenommen und Duplikate nicht entfernt werden sollen.

Die genauen Ergebnisse einer UNION-Operation hängen von der während der Installation ausgewählten Sortierung sowie von der ORDER BY-Klausel ab. Weitere Informationen zu den Auswirkungen unterschiedlicher Sortierungen finden Sie unter Arbeiten mit Sortierungen.

Eine Transact-SQL-Anweisung kann beliebig viele UNION-Operatoren enthalten. Beispiel:

SELECT * FROM TableA
UNION
SELECT * FROM TableB
UNION
SELECT * FROM TableC
UNION
SELECT * FROM TableD

Standardmäßig wertet SQL Server 2005 eine Anweisung mit UNION-Operatoren von links nach rechts aus. Sie können die Auswertungsreihenfolge durch Klammersetzung angeben. Beispielsweise sind die folgenden Anweisungen nicht äquivalent:

/* First statement. */
SELECT * FROM TableA
UNION ALL
(   SELECT * FROM TableB
   UNION
   SELECT * FROM TableC
)
GO

/* Second statement. */
(SELECT * FROM TableA
 UNION ALL
 SELECT * FROM TableB
)
UNION
SELECT * FROM TableC)
GO

Hinweise

In der ersten Anweisung werden Duplikate während der UNION-Operation für TableB und TableC gelöscht. Duplikate in der UNION-Operation für diese Gruppe und TableA werden nicht entfernt. In der zweiten Anweisung werden Duplikate bei der UNION-Operation für TableA und TableB eingeschlossen, während der anschließenden UNION-Operation mit TableC jedoch gelöscht. ALL wirkt sich auf das endgültige Ergebnis dieses Ausdrucks nicht aus.

Wenn UNION verwendet wird, können die einzelnen SELECT-Anweisungen nicht über eigene ORDER BY- oder COMPUTE-Klauseln verfügen. Es kann nur eine ORDER BY- oder COMPUTE-Klausel vorhanden sein; diese folgt auf die letzte SELECT-Anweisung und wird auf das endgültige, kombinierte Resultset angewendet. GROUP BY und HAVING können nur in den einzelnen SELECT-Anweisungen angegeben werden.