## QUERY-Ausdruck (query_expression)

Um eine ungeordnete Ergebnistabelle in einer SELECT-Anweisung (select_statement) zu erzeugen, ist die Angabe eines QUERY-Ausdrucks (query_expression) erforderlich.

### Syntax

<query_expression> ::= <query_term>
| <query_expression> UNION [ALL] <query_term>
| <query_expression> EXCEPT [ALL] <query_term>

<query_term> ::= <query_primary>
| <query_term> INTERSECT [ALL] <query_primary>

<query_primary> ::= <query_spec>
| (<query_expression>)

<query_spec> ::= SELECT [<distinct_spec>] [<top_spec>] <select_column>,... <table_expression>

<top_spec> ::= TOP <unsigned_integer>
| TOP <parameter_name>

### Beispiele

SQL-Tutorial, Auswählen, Anordnen und Umbenennen von Spalten, Mengenoperationen: UNION, INTERSECT, EXCEPT

### Erläuterung

Eine QUERY-Spezifikation spezifiziert eine Ergebnistabelle. Diese wird aus einer Zwischenergebnistabelle erzeugt. Die Zwischenergebnistabelle ist das Ergebnis des Tabellenausdrucks.

Besteht der QUERY-Ausdruck nur aus einer QUERY-Spezifikation query_spec, so ist das Ergebnis des QUERY-Ausdrucks das unveränderte Ergebnis der QUERY-Spezifikation.

Besteht der QUERY-Ausdruck aus mehr als einer QUERY-Spezifikation, muss die Anzahl der selektierten Spalten in allen QUERY-Spezifikationen des QUERY-Ausdrucks gleich sein. Die jeweils i-ten selektierten Spalten der QUERY-Spezfikationen müssen vergleichbar sein.

Spaltenart (select_column) |
Numerische Spalten | Sind untereinander vergleichbar. Sind alle i-ten selektierten Spalten numerische Spalten, so ist die i-te Spalte der Ergebnistabelle eine numerische Spalte.
Alphanumerische Spalten, Codeattribut BYTE | Sind untereinander vergleichbar.
Alphanumerische Spalten, Codeattribut ASCII, UNICODE | Sind untereinander vergleichbar. Sind auch vergleichbar mit Datums-, Zeit- und Zeitstempelwerten.
Alle i-ten Spalten sind Datumswerte | i-te Spalte der Ergebnistabelle ist Datumswert
Alle i-ten Spalten sind Zeitwerte | i-te Spalte der Ergebnistabelle ist Zeitwert
Alle i-ten Spalten sind Zeitstempelwerte | i-te Spalte der Ergebnistabelle ist Zeitstempelwert
Spalten vom Typ BOOLEAN | Sind untereinander vergleichbar.
Alle i-ten Spalten sind vom Typ BOOLEAN | i-te Spalte der Ergebnistabelle ist vom Typ BOOLEAN
Spalten von beliebigem anderen Datentyp (nicht weiter oben genannt) | i-te Spalte der Ergebnistabelle ist eine alphanumerische Spalte. Vergleichbare Spalten mit unterschiedlichen Code-Attributen werden konvertiert.

Sind Spalten vergleichbar, haben aber unterschiedliche Längen, so hat die korrespondierende Spalte der Ergebnistabelle die maximale Länge der zugrundeliegenden Spalten.

#### Namen der Spalten in der Ergebnistabelle

Die Namen der Spalten der Ergebnistabelle werden durch die Namen der selektierten Spalten der ersten QUERY-Spezifikation gebildet.

Sei T1 der linke Operand von UNION, EXCEPT oder INTERSECT (definiert in query_term). T2 sei der rechte Operand. R sei das Ergebnis der Operation T1 und T2.

● Eine Zeile ist ein Duplikat einer anderen Zeile, wenn beide in jeder Spalte identische Werte aufweisen. NULL-Wert e gelten dabei als identisch. Spezial-NULL-Wert e gelten als identisch.

● UNION: R enthält alle Zeilen aus T1 und T2.

● EXCEPT: R enthält alle Zeilen aus T1, die keine Duplikatzeile in T2 besitzen.

● INTERSECT: R enthält alle Zeilen aus T1, die eine Duplikatzeile in T2 besitzen. Eine Zeile aus T2 kann nur Duplikatzeile genau einer Zeile aus T1 sein. Mehrere Zeilen aus T1 können nicht dieselbe Duplikatzeile in T2 besitzen.

● Ist ALL nicht spezifiziert, so wird für die zu T1 und T2 gehörenden QUERY-Ausdrücke jeweils implizit DISTINCT angenommen. Aus R werden alle Duplikatzeilen entfernt.

Bei fehlender Klammerung wird INTERSECT vor UNION und EXCEPT ausgewertet. UNION und EXCEPT haben gleiche Priorität und werden bei fehlender Klammerung von links nach rechts ausgewertet.

#### TOP

Mit Hilfe des TOP-Syntaxelements können Sie angeben, dass nur die ersten n Zeilen des Ergebnisses ausgegeben werden sollen. Erlaubt sind ganze Zahlen zwischen 0 und 2147483647.

Wenn Sie in einer SELECT-Anweisung ein TOP-Syntaxelement und eine ORDER-Klausel verwenden, werden die ersten n Zeilen aller durch die ORDER-Klausel sortierten Zeilen ausgegeben. Wenn in der SELECT-Anweisung keine ORDER-Klausel verwendet wird, werden beliebige n Zeilen ausgegeben.

Wenn ein QUERY-Ausdruck query_expression aus mehreren QUERY-Spezifikationen query_spec besteht, darf das TOP-Syntaxelement nur in der ersten QUERY-Spezifikation enthalten sein.

Wenn Sie ein ROWNO-Prädikat oder eine LIMIT-Klausel verwenden, dürfen Sie das TOP-Syntaxelement nicht verwenden.