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

WITH

Kurzreferenz

Syntax

WITH
  +cte1[( name1, name2, ... )] AS ( SELECT subquery_clauses [UNION ...] )[,
  +cte2[( name1, name2, ... )] AS ( SELECT subquery_clauses [UNION ...] ),
  ... ]
  SELECT mainquery_clauses
         [UNION ...]
         INTO|APPENDING target
         [UP TO ...] [OFFSET ...]
         [abap_options].
  ...
[ENDWITH].


Zusatz:

... ( name1, name2, ... )

Wirkung

Das Open-SQL-Schlüsselwort WITH leitet die Definition von allgemeinen Tabellenausdrücken (kurz CTE von Common Table Expression) zur Verwendung in einer abschließend angegebenen Hauptquery ein. WITH kann wie hier gezeigt als eigenständige Anweisung oder hinter der Anweisung OPEN CURSOR verwendet werden.

Jeder allgemeine Tabellenausdruck erzeugt eine tabellarische Ergebnismenge in einer Subquery , die in den nachfolgenden Queries der WITH-Anweisung als Datenquelle data_source verwendet werden kann. Die Anweisung WITH besteht aus folgenden Anteilen:

Um die Ergebnismengen mehrerer Hauptqueries zu kombinieren, kann das Sprachelement UNION verwendet werden. Dabei gelten zusätzliche Regeln query_clauses für die Angabe der Klauseln.

Ein in der WITH-Anweisung definierter allgemeiner Tabellenausdruck kann hinter seiner Definition in der Subquery eines anderen allgemeinen Tabellenausdrucks und der Hauptquery als Datenquelle data_source verwendet werden. Er kann nicht in seiner eigenen Subquery oder in den Subqueries vorhergehender Definitionen verwendet werden. Ein allgemeiner Tabellenausdruck ist nur innerhalb der aktuellen WITH-Anweisung bekannt.

Jeder in einer WITH-Anweisung definierte allgemeine Tabellenausdruck muss mindestens einmal innerhalb der WITH-Anweisung verwendet werden, entweder in einem anderen allgemeinen Tabellenausdruck oder in der Hauptquery. D.h. die Hauptquery muss auf mindestens einen allgemeinen Tabellenausdruck zugreifen.

Der Name +cte eines allgemeinen Tabellenausdrucks ist in der gesamten WITH-Anweisung gültig. Nur wenn in einer Inline-Deklaration in der INTO-Klausel eine Unterstruktur für einen allgemeinen Tabellenausdruck als Datenquelle erzeugt wird, wird das Zeichen + im Namen der Unterstruktur weggelassen.

Die Ergebnismenge eines allgemeinen Tabellenausdrucks hat niemals eine Mandantenspalte. Selbst wenn die Mandantenspalte einer mandantenabhängigen Datenquelle in der Subquery explizit in deren SELECT-Liste aufgenommen wird, wirkt sie in der Ergebnismenge nicht als solche. Aus diesem Grund kann in einer Query der WITH-Anweisung, welche einen allgemeinen Tabellenausdruck als Datenquelle verwendet, für diese nicht der Zusatz CLIENT SPECIFIED angegeben werden.

Hinweise

Beispiel

Die Ergebnismenge des allgemeinen Tabellenausdrucks +cities ist eine Liste aller Städte, von denen eine Fluggesellschaft an- oder abfliegt. Der allgemeine Tabellenausdruck wird in der Hauptquery als Datenquelle der Subquery der WHERE-Bedingung verwendet.

DATA carrid TYPE spfli-carrid VALUE 'LH'.
cl_demo_input=>request( CHANGING field = carrid ).

WITH
  +cities AS (
    SELECT cityfrom AS city
           FROM spfli
           WHERE carrid = @carrid
    UNION DISTINCT
    SELECT cityto AS city
           FROM spfli
           WHERE carrid = @carrid )
  SELECT *
         FROM sgeocity
         WHERE city IN ( SELECT city
                                FROM +cities )
         INTO TABLE @DATA(result).

cl_demo_output=>display( result ).

Ausführbare Beispiele

Zusatz

... ( name1, name2, ... )

Wirkung

Definition der Spaltennamen eines allgemeinen Tabellenausdrucks +cte. Die angegebenen Namen name1, name2, ... werden den in der SELECT-Liste der Subquery des allgemeinen Tabellenausdrucks definierten Spalten der Reihe nach zugeordnet. Die Namen wirken wie in der SELECT-Liste mit AS definierte alternative Spaltennamen und überschreiben diese.

Die öffnende runde Klammer muss direkt hinter dem Namen +cte1, +cte2, ... stehen. Hinter der öffnenden und vor der schließenden runden Klammer muss mindestens ein Leerzeichen stehen. In der kommaseparierten Liste der Namen können Leerzeichen stehen.

Die Namen dürfen maximal 30 Zeichen lang sein, dürfen Buchstaben, Ziffern, und den Unterstrich enthalten. Sie müssen entweder mit einem Buchstaben oder dem Unterstrich beginnen.

Hinweis

Die Angabe einer Namensliste ist auch möglich, wenn in der SELECT-Liste der Subquery alle Spalten mit * selektiert werden. Dies kann zu Syntaxfehlern führen, wenn die Datenquelle der Subquery nachträglich erweitert wird.

Beispiel

Die Ergebnismengen der beiden allgemeinen Tabellenausdrücke +connections und +sum_seats werden in der Subquery des allgemeinen Tabellenausdrucks +result in einem Join-Ausdruck zusammengeführt. Eine explizite Namensliste ordnet den resultierenden Spalten Namen zu. Diese werden in der Hauptquery zum Sortieren des Ergebnisses verwendet. Für jede Flugverbindung der selektierten Fluggesellschaften wird die Summe aller belegten Plätze aus der Datenbanktabelle SFLIGHT ausgegeben.

DATA from_id TYPE spfli-carrid VALUE 'AA'.
cl_demo_input=>add_field( CHANGING field = from_id ).
DATA to_id TYPE spfli-carrid VALUE 'UA'.
cl_demo_input=>request( CHANGING field = to_id ).
from_id = to_upper( from_id ).
to_id   = to_upper( to_id ).

WITH
  +connections AS (
    SELECT spfli~carrid, carrname, connid, cityfrom, cityto
           FROM spfli
           INNER JOIN scarr
             ON scarr~carrid = spfli~carrid
           WHERE spfli~carrid BETWEEN @from_id AND @to_id ),
  +sum_seats AS (
    SELECT carrid, connid, SUM( seatsocc ) AS sum_seats
           FROM sflight
           WHERE carrid BETWEEN @from_id AND @to_id
           GROUP BY carrid, connid ),
  +result( name, connection, departure, arrival, occupied ) AS (
    SELECT carrname, c~connid, cityfrom, cityto, sum_seats
           FROM +connections AS c
             INNER JOIN +sum_seats AS s
               ON c~carrid = s~carrid AND
                  c~connid = s~connid )
  SELECT *
         FROM +result
         ORDER BY name, connection
         INTO TABLE @DATA(result).

cl_demo_output=>display( result ).



Weiterlesen
WITH - subquery_clauses
WITH - mainquery_clauses
ENDWITH
WITH - Beispiele