Richtlinien für das Verwenden von UNION-Operatoren
Für das Verwenden von UNION-Operatoren gelten folgende Richtlinien:
Alle Auswahllisten in den mit UNION kombinierten Anweisungen müssen über dieselbe Anzahl von Ausdrücken (Spaltennamen, arithmetische Ausdrücke, Aggregatfunktionen usw.) verfügen.
Die einander entsprechenden Spalten in den mit UNION kombinierten Resultsets bzw. die in einer einzelnen Abfrage verwendeten Spalten einer Teilmenge müssen denselben Datentyp aufweisen, oder es muss eine implizite Datenkonvertierung zwischen den beiden Datentypen möglich sein bzw. eine explizite Datenkonvertierung angegeben werden. Beispielsweise funktioniert ein UNION-Operator zwischen einer datetime-Datentypspalte und einer binary-Datentypspalte nur, wenn eine explizite Konvertierung angegeben wird. Ein UNION-Operator funktioniert jedoch zwischen einer money-Datentypspalte und einer int-Datentypspalte, da diese implizit konvertiert werden können.
Spalten, die dem xml-Datentyp angehören, müssen äquivalent sein. Alle Spalten müssen entweder für ein XML-Schema typisiert, oder gar nicht typisiert sein. Wenn sie jedoch typisiert sind, müssen sie für dieselbe XML-Schemaauflistung typisiert sein.
Einander entsprechende Resultsetspalten in den einzelnen Anweisungen, die mit UNION kombiniert werden sollen, müssen in derselben Reihenfolge vorliegen, da UNION die Spalten eins-zu-eins in der Reihenfolge vergleicht, in der die Spalten in den einzelnen Abfragen vorliegen.
Beispiel:
TABLE3
TABLE4
A
B
C
A
B
INT
CHAR(4)
CHAR(4)
CHAR(4)
FLOAT
---
-------
-------
-------
-------
1
ABC
JKL
JKL
1.000
2
DEF
MNO
MNO
5.000
3
GHI
PQR
Führen Sie die folgende Abfrage aus:
SELECT a, b FROM table3 UNION SELECT b, a FROM table4
Im Folgenden wird das Resultset aufgeführt:
a b -------- ----- 1.000000 abc 2.000000 def 3.000000 ghi 1.000000 jkl 5.000000 mno
Werden bei einem UNION-Vorgang verschiedene Datentypen kombiniert, werden sie unter Berücksichtigung der Regeln für die Rangfolge von Datentypen konvertiert. Im vorausgegangenen Beispiel werden die int-Werte in float-Werte konvertiert, da float gegenüber int Vorrang besitzt. Weitere Informationen finden Sie unter Rangfolge der Datentypen (Transact-SQL).
Die folgende Abfrage verursacht eine Fehlermeldung, da die Datentypen der einander entsprechenden Spalten nicht kompatibel sind:
SELECT b, c FROM table3 UNION SELECT a, b FROM table4
Die Spaltennamen der Tabelle, die sich aus dem UNION-Vorgang ergeben, werden aus der ersten Einzelabfrage der UNION-Anweisung übernommen. Um auf eine Spalte im Resultset mit einem neuen Namen zu verweisen (z. B. in einer ORDER BY-Klausel), muss der neue Name der Spalte bereits in der ersten SELECT-Anweisung verwendet werden:
SELECT city AS Cities FROM stores_west UNION SELECT city FROM stores_east ORDER BY city