ABAP - Keyword Documentation →  ABAP - Reference →  Processing External Data →  ABAP Database Accesses →  Open SQL →  Open SQL - Reads →  SELECT clauses → 

Quick Reference

SELECT - FOR ALL ENTRIES

Syntax

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

Effect

If the addition FOR ALL ENTRIES is specified in front of the language element WHERE of the statement SELECT of a main query, the components comp of the internal table itab specified here can be used within sql_cond on the right side of comparisons of a relational operator in comparisons with a column col. The specified component comp must be compatible with the column col. The internal table itab can have a structured or an elementary row type. For an elementary row type, the pseudo component table_line must be specified for comp. The name of the host variable dbcur should be prefixed with the escape character @.

The entire logical expression sql_cond is evaluated for each individual row of the internal table itab. The results set of the SELECT statement is the union set of the results sets produced by the individual evaluations. Rows that occur more than once are removed from the results set automatically. The full content of a row is considered here.

If the internal table itab is empty, the entire WHERE condition is ignored. This means that none of the rows in the database table are skipped and are placed in the results set (once any duplicate rows are removed).

The logical expression sql_cond of the WHERE condition can comprise multiple logical expressions using AND and OR. However, if FOR ALL ENTRIES is specified, there must be at least one comparison with a column of the internal table itab that can be specified statically or dynamically.

The following restrictions apply when using the addition FOR ALL ENTRIES with other additions:

The internal table itab is evaluated once for each query. Any changes made to the content of the internal table in a SELECT loop or WITH loop are ignored by the logical expression.

Notes

In all other cases, table buffering is used and the addition FOR ALL ENTRIES can be a more efficient alternative to join expressions.

Example

Gets all flight data for a specified departure city. The relevant airlines and flight numbers are first passed to an internal table entry_tab, which is evaluated in the WHERE condition of the subsequent SELECT statement. This selection could also be carried out in a single SELECT statement by using a join in the FROM clause. Make sure that the table entry_tab is not initial before the SELECT statement is executed using FOR ALL ENTRIES.

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.

Example

Uses FOR ALL ENTRIES with an empty internal table. All rows of the database table are respected. The number of read rows is usually, however, smaller in the first SELECT statement than in the second statement. This is because only one column is read and hence more duplicate rows can be removed. The second SELECT statement, on the other hand, moves all rows of the database table to the results set, since their structure covers the full table key.

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