Show TOC Anfang des Inhaltsbereichs

Datenbanktabellen angeben  Dokument im Navigationsbaum lokalisieren

Die FROM-Klausel bestimmt die Datenbanktabellen, von denen die Daten in die Selektion der SELECT-Klausel gelesen werden. Es kann entweder eine einzelne Tabelle angegeben werden oder es können mehrere Tabellen über innere und äußere Joins verknüpft werden. Einzelne Datenbanktabellen können statisch oder dynamisch angegeben werden und ihre Namen können durch Alternativnamen ersetzt werden. In der FROM-Klausel kann weiterhin die SAP-Pufferung umgangen und die Anzahl der zu lesenden Zeilen eingeschränkt werden.

Diese Grafik wird im zugehörigen Text erklärt

Der Ausdruck Datenbanktabelle steht hier auch immer stellvertretend für einen View im ABAP Dictionary. Ein View ist eine im Dictionary vordefinierte Verknüpfung mehrerer Datenbanktabellen und stellt somit einen programmübergreifenden statischen Join dar. Überall, wo in der FROM-Klausel eine Datenbanktabelle angeben werden kann, kann auch der Name eines Views stehen.

Die FROM-Klausel lässt sich in zwei Teile für die Angabe von Datenbanktabellen und weitere Zusätze für die Steuerung des Datenbankzugriffs unterteilen:

SELECT ... FROM tables options ...

In tables werden die Namen der Datenbanktabellen angegeben und Joins definiert.
In
options kann durch die Angabe von:

·        CLIENT SPECIFIED die automatische Mandantenbehandlung ausgeschaltet werden

·        BYPASSING BUFFER die Datenpufferung ausgeschaltet werden

·        UP TO n ROWS die absolute Anzahl von Zeilen in der Selektion auf n begrenzt werden.

Für weitere Details zu diesen Zusätzen: siehe Schlüsselwortdokumentation.

Einzelne Datenbanktabelle statisch angeben

Um den Namen einer einzelnen Datenbanktabelle statisch anzugeben, schreibt man für tables:

SELECT ... FROM dbtab [AS tabalias] options ...

Die Datenbanktabelle dbtab muss im ABAP Dictionary bekannt sein. Mit dem AS-Zusatz kann man die Datenbanktabelle für den Gebrauch in der SELECT-, FROM-, WHERE-, und GROUP-BY- Klausel in den Alternativnamen tabalias umbenennen.

Einzelne Datenbanktabelle dynamisch angeben

Um den Namen einer einzelnen Datenbanktabelle dynamisch anzugeben, schreibt man für tables:

SELECT ... FROM (name) options ...

Das Feld name muss den Namen einer Datenbanktabelle, die im ABAP Dictionary bekannt ist, in Großbuchstaben enthalten. Bei der dynamischen Angabe der Datenbanktabelle kann die leere INTO-Klausel, die alle Spalten einer Zeile in den Arbeitsbereich dbtab stellt, nicht verwendet werden. Es kann auch kein alternativer Tabellennamen angegeben werden.

Mehrere Datenbanktabellen als Inner Join angeben

Um mehrere Datenbanktabellen in einer einzigen SELECT-Anweisung so zu verknüpfen, dass die Daten der beteiligten Tabellen eine gemeinsame Bedingung erfüllen, schreibt man für tables folgenden Join-Ausdruck:

SELECT ...
...
  FROM tab [INNER] JOIN dbtab [AS alias] ON cond options
...

Hierbei ist dbtab eine einzelne Datenbanktabelle und tab ist entweder auch eine einzelne Datenbanktabelle oder selbst ein Join-Ausdruck. Die einzelnen Datenbanktabellen müssen statisch angegeben werden, wobei auch alternative Tabellennamen vergeben werden können. Ein Join-Ausdruck verknüpft jede selektierte Zeile von tab mit den Zeilen in dbtab, welche die Bedingung cond erfüllen. Es werden also immer von rechts eine bis mehrere Zeilen einer Datenbanktabelle mit jeweils einer Zeile der linken Datenbanktabelle bzw. des dort definierten Joins verknüpft. Falls es in dbtab keine Zeilen gibt, welche die Bedingung cond erfüllen, wird auch die Zeile aus tab nicht in die Selektion aufgenommen.

Diese Grafik wird im zugehörigen Text erklärt

Mehrere Datenbanktabellen als Left Outer Join angeben

Beim Inner Join wird eine Zeile aus der linken Datenbanktabelle bzw. Join nur dann in die Selektion aufgenommen, falls es in der rechten Datenbanktabelle eine oder mehrere Zeilen gibt, welche die ON-Bedingung cond erfüllen. Der Left Outer Join liest Zeilen der linken Datenbanktabelle bzw. Join auch dann, wenn es keine passenden Zeilen in der rechten Tabelle gibt:

SELECT...
...
  FROM tab LEFT [OUTER] JOIN dbtab [AS alias] ON cond
      
options
...

Beispiele

Beispiel

Statische Angabe einer Datenbanktabelle.

REPORT demo_select_static_database.

DATA wa TYPE scarr.

SELECT *
  INTO wa
  FROM scarr UP TO 4 ROWS.

  WRITE: / wa-carrid, wa-carrname.

ENDSELECT.

Die Listenausgabe ist:

Diese Grafik wird im zugehörigen Text erklärt

Es werden vier Zeilen aus der Datenbanktabelle SCARR gelesen.

Beispiel

Dynamische Angabe einer Datenbanktabelle.

REPORT demo_select_dynamic_database.

DATA wa TYPE scarr.

DATA name(10) TYPE c VALUE 'SCARR'.

SELECT  *
  INTO  wa
  FROM  (name) CLIENT SPECIFIED
  WHERE mandt = '000'.

  WRITE: / wa-carrid, wa-carrname.

ENDSELECT.

Da die Option CLIENT SPECIFIED verwendet wird, ist die Bedingung für die Spalte MANDT sinnvoll. Falls der Inhalt von name 'scarr' statt 'SCARR' wäre, käme es zum Laufzeitfehler, da die Tabelle 'scarr' nicht vorhanden ist.

Beispiel

Inner Join.

REPORT demo_select_inner_join.

DATA: BEGIN OF wa,
        carrid TYPE spfli-carrid,
        connid TYPE spfli-connid,
        fldate TYPE sflight-fldate,
        bookid TYPE sbook-bookid,
      END OF wa,
      itab LIKE SORTED TABLE OF wa
                WITH UNIQUE KEY carrid connid fldate bookid.

SELECT  p~carrid p~connid f~fldate b~bookid
  INTO  CORRESPONDING FIELDS OF TABLE itab
  FROM  ( ( spfli AS p
            INNER JOIN sflight AS f ON p~carrid = f~carrid AND
                                       p~connid = f~connid    )
            INNER JOIN sbook   AS b ON b~carrid = f~carrid AND
                                       b~connid = f~connid AND
                                       b~fldate = f~fldate     )
  WHERE p~cityfrom = 'FRANKFURT' AND
        p~cityto   = 'NEW YORK'  AND
        f~seatsmax > f~seatsocc.

LOOP AT itab INTO wa.
  AT NEW fldate.
    WRITE: / wa-carrid, wa-connid, wa-fldate.
  
ENDAT.
  WRITE / wa-bookid.
ENDLOOP.

Es werden die Spalten CARRID, CONNID, FLDATE und BOOKID der Tabellen SPFLI, SFLIGHT und SBOOK miteinander verknüpft und eine Liste der Buchungsnummern für sämtliche nicht ausgebuchten Flüge von Frankfurt nach New York erstellt. Für jede Tabelle werden Alternativnamen verwendet.

Beispiel

Left Outer Join.

REPORT demo_select_left_outer_join.

DATA: BEGIN OF wa,
        carrid   TYPE scarr-carrid,
        carrname TYPE scarr-carrname,
        connid   TYPE spfli-connid,
      END OF wa,
      itab LIKE SORTED TABLE OF wa
                WITH NON-UNIQUE KEY carrid.

SELECT s~carrid s~carrname p~connid
  INTO CORRESPONDING FIELDS OF TABLE itab
  FROM scarr AS s
       LEFT OUTER JOIN spfli AS p ON s~carrid   =  p~carrid AND
                                     p~cityfrom = '
FRANKFURT'.

LOOP AT itab INTO wa.
  WRITE: / wa-carrid, wa-carrname, wa-connid.
ENDLOOP.

Die Listenausgabe könnte z.B. so aussehen:

Diese Grafik wird im zugehörigen Text erklärt

Es werden die Spalten CARRID, CARRNAME und CONNID der Tabellen SCARR und SPFLI unter der Bedingung mit einem Left Outer Join miteinander verknüpft, dass die Fluggesellschaft von Frankfurt  aus fliegt. Alle übrigen Fluggesellschaften haben den Wert Null in der Spalte CONNID der Selektion..

Falls der Left Outer Join durch einen Inner Join ersetzt wird, sieht die Liste so aus:

Diese Grafik wird im zugehörigen Text erklärt

Nur solche Zeilen, welche die ON-Bedingung erfüllen, werden in die Selektion aufgenommen.

 

Ende des Inhaltsbereichs