Show TOC

Selektion definierenLocate this document in the navigation structure

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

  • Hierbei bezeichnen dies 1 s 2 … einzelne Spalten. Durch den Zusatz AS kann für jede Spaltes 1 s 2 … ein alternativer Spaltenname a 1 a 2 …  definiert werden. Der alternative Spaltenname wird in derINTO -Klausel und in derORDER-BY -Klausel statt dem richtigen Spaltennamen verwendet. Beispielsweise kann so erreicht werden, dass bei der VarianteINTO CORRESPONDING FIELDS der INTO -Klausel der Inhalt einer Spalte s 1 in eine Komponentea 1 einer Struktur geschrieben wird.

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:

  • MAX : liefert den Maximalwert der Spalte
  • MIN : liefert den Minimalwert der Spalte
  • AVG : liefert den Durchschnittswert der Spalte
  • SUM : liefert die Summe der Spalte
  • COUNT : zählt Werte oder Zeilen wie folgt:
    • 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.

Tipp

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.

Tipp

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.

Tipp

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.

Tipp

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

Tipp

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.