Show TOC Anfang des Inhaltsbereichs

Selektion definieren  Dokument im Navigationsbaum lokalisieren

Die SELECT-Klausel definiert die Struktur der Ergebnismenge (Selektion), für die von der Datenbank zu lesenden Daten.

Diese Grafik wird im zugehörigen Text erklärt

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.

Die SELECT-Klausel lässt sich in zwei Teile für Zeilen und Spalten unterteilen:

SELECT lines cols ...

In lines wird angegeben, ob eine einzelne Zeile mit: SELECT SINGLE cols

oder mehrere Zeilen mit: SELECT [DISTINCT] cols gelesen werden.

Ohne Angabe von DISTINCT (lines ist also leer), werden alle Zeilen in Abhängigkeit von der WHERE-Klausel gelesen. Bei der Angabe von DISTINCT werden doppelt vorkommende Zeilen ausgeschlossen.

In cols wird die Spaltenauswahl definiert.

Alle Spalten lesen

Um alle Spalten zu lesen schreibt man für cols:

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ür cols:

SELECT lines s1 [AS a1] s2 [AS a2] ...

Hierbei bezeichnen die s1 s2 … einzelne Spalten. Durch den Zusatz AS kann für jede Spalte s1 s2 … ein alternativer Spaltenname a1 a2  definiert werden. Der alternative Spaltenname wird in der INTO-Klausel und in der ORDER-BY-Klausel statt dem richtigen Spaltennamen verwendet. Beispielsweise kann so erreicht werden, dass bei der Variante INTO CORRESPONDING FIELDS der INTO-Klausel der Inhalt einer Spalte s1 in eine Komponente a1 einer Struktur geschrieben wird.

Aggregate einzelner Spalten lesen

Um Aggregate, also zusammengefasste Daten, einzelner Spalten zu lesen, schreibt man für cols:

SELECT lines agg( [DISTINCT] s1) [AS a1]
             agg( [DISTINCT] s2) [AS a2]
...

Hierbei sind die s1 s2 … 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

Mit DISTINCT können doppelt vorkommende Werte aus der Berechnung ausgeschlossen werden. Mit dem Zusatz AS kann wieder für jeden Aggregatausdruck ein alternativer Spaltenname a1 a2 …definiert werden.

Dynamische Spaltenangaben

Die Angabe cols kann auch dynamisch gemacht werden:

SELECT lines (itab)...

In den Klammern muss der Name einer internen Tabelle itab stehen, die entweder leer ist oder die Angaben s1 s2 … zum Lesen einzelner Spalten bzw. entsprechende Aggregatausdrücke enthält. Ist die interne Tabelle leer, bezeichnet sie alle Spalten.

Beispiel

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:

Diese Grafik wird im zugehörigen Text erklärt

Durch die Angabe SINGLE in der SELECT-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 Struktur wageschrieben.

Beispiel

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:

Diese Grafik wird im zugehörigen Text erklärt

Da keine Angabe zu den Zeilen in der SELECT-Klausel gemacht werden, liest die SELECT-Anweisung alle Zeilen der Datenbanktabelle SPFLI, welche die Bedingung in der WHERE-Klausel erfüllen. Die in der SELECT-Klausel angegebenen Spalten werden in die gleichnamigen Komponenten der Tabelle itab geschrieben.

Beispiel

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:

Diese Grafik wird im zugehörigen Text erklärt

Da keine Angabe zu den Zeilen in der SELECT-Klausel gemacht werden, liest die SELECT-Anweisung alle Zeilen der Datenbanktabelle SPFLI, welche die Bedingung in der WHERE-Klausel erfüllen. Alle Spalten der Tabelle werden in die gleichnamigen Komponenten einer flachen Struktur WA geschrieben. Deshalb muss eine mit ENDSELECT abgeschlossene SELECT-Schleife programmiert werden.

Beispiel

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ücken agg 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

Beispiel

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:

Diese Grafik wird im zugehörigen Text erklärt

In der internen Tabelle itab sind die aus der Datenbanktabelle SPFLI zu lesenden Spalten angegeben. Durch die Angabe DISTINCT in der SELECT-Klausel liest die SELECT-Anweisung alle Zeilen die in diesen beiden Spalten einen unterschiedlichen Inhalts haben. Es ergibt sich eine Liste der möglichen Flugstrecken.

 

 

Ende des Inhaltsbereichs