
DieSELECT -Klausel definiert die Struktur der Ergebnismenge (Selektion), für die von der Datenbank zu lesenden Daten.
Die Selektion kann eine einzelne Zeile also flach sein, oder aus mehreren Zeilen bestehen, also tabellenartig sein. Doppelt vorkommende Zeilen können ausgeschlossen werden. Die SELECT -Klausel bestimmt weiterhin die zu lesenden Spalten und definiert deren Namen. Dabei können die Namen aus der Datenbanktabelle durch alternative Spaltennamen ersetzt werden Auf einzelne Spalten können Aggregatfunktionen angewendet werden.
DieSELECT -Klausel lässt sich in zwei Teile für Zeilen und Spalten unterteilen:
SELECT lines cols ...
Inlines wird angegeben, ob eine einzelne Zeile mit: SELECT SINGLE cols
oder mehrere Zeilen mit: SELECT [DISTINCT] cols gelesen werden.
Ohne Angabe vonDISTINCT (lines ist also leer), werden alle Zeilen in Abhängigkeit von derWHERE -Klausel gelesen. Bei der Angabe vonDISTINCT werden doppelt vorkommende Zeilen ausgeschlossen.
Incols wird die Spaltenauswahl definiert.
Alle Spalten lesen
Um alle Spalten zu lesen schreibt man fürcols :
SELECT lines *...
Es werden alle Spalten der angegebenen Zeilen gelesen. Das Lesen einzelner Spalten kann erheblich performanter sein, als alle Spalten einer Datenbanktabelle zu lesen. Es sollten deshalb immer nur die Spalten gelesen werden, die auch im Programm benötigt werden.
Einzelne Spalten lesen
Um einzelne Spalten zu lesen schreibt man fürcols :
SELECT lines s1 [AS a1] s2 [AS a2] ...
Aggregate einzelner Spalten lesen
Um Aggregate, also zusammengefasste Daten, einzelner Spalten zu lesen, schreibt man fürcols :
SELECT lines agg( [DISTINCT] s1) [AS a1]
agg( [DISTINCT] s2) [AS a2] ...
Hierbei sind dies 1 s 2 … wieder einzelne Spalten. Der Ausdruck agg steht für eine der folgenden Aggregatfunktionen:
COUNT( DISTINCT s ) liefert die Anzahl unterschiedlicher Werte in der Spalte s .
COUNT( * ) bzw. count(*) liefert die gesamte Anzahl der Zeilen in der Ergebnismenge
MitDISTINCT können doppelt vorkommende Werte aus der Berechnung ausgeschlossen werden. Mit dem ZusatzAS kann wieder für jeden Aggregatausdruck ein alternativer Spaltennamea 1 a 2 … definiert werden.
Dynamische Spaltenangaben
Die Angabecols kann auch dynamisch gemacht werden:
SELECT lines (itab)...
In den Klammern muss der Name einer internen Tabelleitab stehen, die entweder leer ist oder die Angabens 1 s 2 … zum Lesen einzelner Spalten bzw. entsprechende Aggregatausdrücke enthält. Ist die interne Tabelle leer, bezeichnet sie alle Spalten.
Lesen bestimmter Spalten einer einzigen Zeile.
REPORT demo_select_single. DATA wa TYPE spfli. SELECT SINGLE carrid connid cityfrom cityto INTO CORRESPONDING FIELDS OF wa FROM spfli WHERE carrid EQ 'LH' AND connid EQ '0400'. IF sy-subrc EQ 0. WRITE: / wa-carrid, wa-connid, wa-cityfrom, wa-cityto. ENDIF.
Die Listenausgabe ist:
Durch die AngabeSINGLE in derSELECT -Klausel liest die SELECT -Anweisung eine einzige Zeile der Datenbanktabelle SPFLI, in der die Primärschlüsselfelder CARRID und CONNID entsprechend der WHERE -Klausel gefüllt sind. Die in der SELECT -Klausel angegebenen Spalten werden in die gleichnamigen Komponenten der Strukturwa geschrieben.
Lesen bestimmter Spalten mehrerer Zeilen.
REPORT demo_select_some_columns. DATA: itab TYPE STANDARD TABLE OF spfli, wa LIKE LINE OF itab. SELECT carrid connid cityfrom cityto INTO CORRESPONDING FIELDS OF TABLE itab FROM spfli WHERE carrid EQ 'LH'. IF sy-subrc EQ 0. LOOP AT itab INTO wa. WRITE: / wa-carrid, wa-connid, wa-cityfrom, wa-cityto. ENDLOOP. ENDIF.
Die Listenausgabe ist:
Da keine Angabe zu den Zeilen in derSELECT -Klausel gemacht werden, liest dieSELECT -Anweisung alle Zeilen der Datenbanktabelle SPFLI, welche die Bedingung in derWHERE -Klausel erfüllen. Die in der SELECT -Klausel angegebenen Spalten werden in die gleichnamigen Komponenten der Tabelleitab geschrieben.
Lesen aller Spalten mehrerer Zeilen.
REPORT demo_select_all_columns. DATA wa TYPE spfli. SELECT * INTO CORRESPONDING FIELDS OF wa FROM spfli WHERE carrid EQ 'LH'. WRITE: / sy-dbcnt, wa-carrid, wa-connid, wa-cityfrom, wa-cityto. ENDSELECT.
Die Listenausgabe ist:
Da keine Angabe zu den Zeilen in derSELECT -Klausel gemacht werden, liest dieSELECT -Anweisung alle Zeilen der Datenbanktabelle SPFLI, welche die Bedingung in derWHERE -Klausel erfüllen. Alle Spalten der Tabelle werden in die gleichnamigen Komponenten einer flachen Struktur WA geschrieben. Deshalb muss eine mitENDSELECT abgeschlossene SELECT -Schleife programmiert werden.
Aggregatfunktionen.
Die Datenbanktabelle TEST bestehe aus zwei Spalten und 10 Zeilen:
| COL_1 | COL_2 |
|---|---|
|
1 |
3 |
|
2 |
1 |
|
3 |
5 |
|
4 |
7 |
|
5 |
2 |
|
6 |
3 |
|
7 |
1 |
|
8 |
9 |
|
9 |
4 |
|
10 |
3 |
Der folgende Programmabschnitt demonstriert die Aggregatfunktionen:
DATA RESULT TYPE P DECIMALS 2. SELECT agg( [DISTINCT] COL_2) INTO RESULT FROM TEST. WRITE RESULT.
Folgende Tabelle zeigt die Ergebnisse dieser Programmzeilen, die sich aus verschiedenen Kombinationen von Aggregatausdrückenagg mit dem Zusatz DISTINCT ergeben.
| Aggregatausdruck | DISTINCT | Ergebnis |
|---|---|---|
|
MAX |
nein |
9.00 |
|
MAX |
ja |
9.00 |
|
MIN |
nein |
1.00 |
|
MIN |
ja |
1.00 |
|
AVG |
nein |
3.80 |
|
AVG |
ja |
4.43 |
|
SUM |
nein |
38.00 |
|
SUM |
ja |
31.00 |
|
COUNT |
ja |
7.00 |
|
COUNT( * ) |
--- |
10.00 |
Dynamische Spaltenangaben
REPORT demo_select_dynamic_columns. DATA: itab TYPE STANDARD TABLE OF spfli, wa LIKE LINE OF itab. DATA: line(72) TYPE c, list LIKE TABLE OF line(72). line = ' CITYFROM CITYTO '. APPEND line TO list. SELECT DISTINCT (list) INTO CORRESPONDING FIELDS OF TABLE itab FROM spfli. IF sy-subrc EQ 0. LOOP AT itab INTO wa. WRITE: / wa-cityfrom, wa-cityto. ENDLOOP. ENDIF.
Die Listenausgabe ist:
In der internen Tabelleitab sind die aus der Datenbanktabelle SPFLI zu lesenden Spalten angegeben. Durch die AngabeDISTINCT in der SELECT -Klausel liest dieSELECT -Anweisung alle Zeilen die in diesen beiden Spalten einen unterschiedlichen Inhalts haben. Es ergibt sich eine Liste der möglichen Flugstrecken.