ABAP - Schlüsselwortdokumentation →  ABAP - Referenz →  Externe Daten verarbeiten →  ABAP-Datenbankzugriffe →  Open SQL →  Open SQL - Lesende Zugriffe →  SELECT - clauses → 

Kurzreferenz

SELECT - FOR ALL ENTRIES

Syntax

... FOR ALL ENTRIES IN @itab WHERE ... col operator @itab-comp ...

Wirkung

Wenn vor dem Sprachelement WHERE der Anweisung SELECT einer Hauptquery der Zusatz FOR ALL ENTRIES angegeben ist, können die Komponenten comp der dort angegebenen internen Tabelle itab innerhalb von sql_cond auf der rechten Seite eines Vergleichsoperators in Vergleichen mit einer Spalte col verwendet werden. Die angegebene Komponente comp muss zur Spalte col kompatibel sein. Die interne Tabelle itab kann einen strukturierten oder einen elementaren Zeilentyp haben. Bei elementarem Zeilentyp ist für comp die Pseudokomponente table_line anzugeben. Dem Namen der internen Tabelle soll wie allen Hostvariablen das Fluchtsymbol @ vorangestellt werden.

Der gesamte logische Ausdruck sql_cond wird für jede einzelne Zeile der internen Tabelle itab ausgewertet. Die Ergebnismenge der SELECT-Anweisung ist die Vereinigungsmenge der Ergebnismengen, die sich aus den einzelnen Auswertungen ergeben. Mehrfach vorkommende Zeilen werden automatisch aus der Ergebnismenge entfernt, wofür der gesamte Zeileninhalt betrachtet wird.

Wenn die interne Tabelle itab leer ist, wird die gesamte WHERE-Bedingung ignoriert. D.h. es werden alle Zeilen der Datenbanktabelle berücksichtigt und nach Entfernung der mehrfach vorkommenden Zeilen in die Ergebnismenge gestellt.

Der logische Ausdruck sql_cond der WHERE-Bedingung kann über AND und OR aus verschiedenen logischen Ausdrücken zusammengesetzt sein. Wenn FOR ALL ENTRIES angegeben ist, muss es aber mindestens einen Vergleich mit einer Spalte der internen Tabelle itab geben, der statisch oder dynamisch angegeben werden kann.

Bei Verwendung des Zusatzes FOR ALL ENTRIES gelten folgende Einschränkungen im Zusammenspiel mit anderen Zusätzen:

Die interne Tabelle itab wird einmal pro Query ausgewertet. Eine Änderung des Inhalts der internen Tabelle in einer SELECT- oder WITH-Schleife hat keinen Einfluss auf den logischen Ausdruck.

Hinweise

In allen anderen Fällen wird die Tabellenpufferung verwendet und der Zusatz FOR ALL ENTRIES kann eine performantere Alternative für Join-Ausdrücke darstellen.

Beispiel

Auslesen von Flugdaten für eine vorgegebene Abflugstadt. Die entsprechenden Fluggesellschaften und Flugnummern werden zuerst in eine interne Tabelle entry_tab gestellt, die in der WHERE-Bedingung der folgenden SELECT-Anweisung ausgewertet wird. Diese Selektion könnte mit einem Join in der FROM-Klausel auch in einer einzigen SELECT-Anweisung erfolgen. Beachten sie, dass vor der Ausführung der SELECT-Anweisung mit FOR ALL ENTRIES sichergestellt wird, dass die Tabelle entry_tab nicht initial ist.

DATA city TYPE spfli-cityfrom VALUE 'FRANKFURT'.
cl_demo_input=>request( CHANGING field = city ).

SELECT carrid, connid
       FROM spfli
       WHERE cityfrom = @( to_upper( city ) )
       INTO TABLE @DATA(entry_tab).

IF entry_tab IS NOT INITIAL.
  SELECT carrid, connid, fldate
         FROM sflight
         FOR ALL ENTRIES IN @entry_tab
         WHERE carrid = @entry_tab-carrid AND
               connid = @entry_tab-connid
         ORDER BY PRIMARY KEY
         INTO TABLE @DATA(result_tab).
  cl_demo_output=>display( result_tab ).
ENDIF.

Beispiel

Verwendung von FOR ALL ENTRIES mit leerer interner Tabelle. Es werden alle Zeilen der Datenbanktabelle berücksichtigt. Die Anzahl gelesener Zeilen ist in der ersten SELECT-Anweisung in aller Regel aber kleiner als in der zweiten, da nur eine Spalte gelesen wird und dadurch mehr mehrfach vorkommende Zeilen entfernt werden können. Die zweite SELECT-Anweisung stellt dagegen alle Zeilen der Datenbanktabelle in die Ergebnismenge, da deren Struktur den gesamten Tabellenschlüssel abdeckt.

DATA carriers TYPE TABLE OF scarr.

SELECT carrid, connid
       FROM spfli
       FOR ALL ENTRIES IN @carriers
       WHERE carrid = @carriers-carrid
       INTO TABLE @DATA(result1).
cl_demo_output=>write( result1 ).

SELECT carrid
       FROM spfli
       FOR ALL ENTRIES IN @carriers
       WHERE carrid = @carriers-carrid
       INTO TABLE @DATA(result2).
cl_demo_output=>display( result2 ).