Ansicht
Dokumentation

ABENCDS_F1_UNION - CDS F1 UNION

ABENCDS_F1_UNION - CDS F1 UNION

CPI1466 during Backup   PERFORM Short Reference  
Diese Dokumentation steht unter dem Copyright der SAP AG.
SAP E-Book

- SELECT, UNION

... UNION $[ALL$] select_statement ...

Wirkung

Vereinigt die Zeilen der Ergebnismengen zweier SELECT-Anweisungen einer CDS-View zu einer Ergebnismenge, die dann Zeilen aus beiden Ergebnismengen umfasst. Voraussetzung ist, dass die Ergebnismengen der zu vereinigenden die gleiche Anzahl an Elementen haben und diese an jeder Position paarweise einen verträglichen Datentyp haben. Die Datentypen DF16_..., DF34_..., LCHR,LRAW,STRING, RAWSTRING oder GEOM_EWKB werden nicht unterstützt. Eine vereinigte Ergebnismenge kann wieder linke Seite einer weiteren Vereinigung sein. Ohne den Zusatz ALL werden duplikative Einträge aus der Ergebnismenge entfernt. Mit dem Zusatz ALL werden sie nicht entfernt. Die Eigenschaften der Elemente der vereinigten Ergebnismenge werden wie folgt bestimmt:

  • Elementnamen
  • Wenn eine explizite Namensliste angegeben ist, bestimmt diese die Namen der Elemente

  • Wenn keine explizite Namensliste angegeben ist, müssen die direkten oder mit AS definierten alternativen Elementnamen für jede Spalte in den SELECT-Listen aller SELECT-Anweisungen übereinstimmen und werden verwendet.

  • Schlüsselelemente
Die Definition der Schlüsselelemente stammt aus der SELECT-Liste der ersten SELECT-Anweisung.
  • Elementannotationen
Elementannotationen werden nur aus der SELECT-Liste der ersten SELECT-Anweisung übernommen.
  • Datentyp
  • Der Datentyp jedes Elements der CDS-Entität ist der Dictionary-Typ des Elements aus der SELECT-Liste der ersten SELECT-Anweisung.

  • Der Datentyp mit dem die Vereinigungsmenge auf der Datenbank gebildet wird, ist ein Datentyp dessen Wertebereich die Datentypen der zugehörigen Spalten aller beteiligten Ergebnismengen umfasst.

Die folgende Tabelle zeigt welche Datentypen in der SELECT-Liste der ersten SELECT-Anweisung mit welchen Datentypen folgender SELECT-Anweisungen mit UNION vereinigt werden können.

erster/folgende INT1 INT2 INT4 INT8 DEC CURR QUAN FLTP CHAR SSTRING NUMC DATS TIMS ACCP CLNT LANG UNIT CUKY RAW
INT1 x w w w w w w w - - - - - - - - - - -
INT2 x x w w w w w w - - - - - - - - - - -
INT4 x x x w w w w w - - - - - - - - - - -
INT8 x x x x w w w w - - - - - - - - - - -
DEC w w w w w w w w - - - - - - - - - - -
CURR w w w w w w w w - - - - - - - - - - -
QUAN w w w w w w w w - - - - - - - - - - -
FLTP x x x w w w w x - - - - - - - - - - -
CHAR - - - - - - - - w w l w w l l l l l -
SSTRING - - - - - - - - w w - - - - - - - - -
NUMC - - - - - - - - w - l l l l l l - - -
DATS - - - - - - - - w - l x - - - - - - -
TIMS - - - - - - - - w - l - x - - - - - -
ACCP - - - - - - - - l - l - - x - - - - -
CLNT - - - - - - - - l - l - - - x - - - -
LANG - - - - - - - - l - l - - - - x - - -
UNIT - - - - - - - - l - - - - - - - x - -
CUKY - - - - - - - - l - - - - - - - - x -
RAW - - - - - - - - - - - - - - - - - - x

Bei Kombinationen mit "x" sind keine weiteren Einschränkungen zu beachten. Bei den übrigen Kombinationen gelten folgende Regeln:

  • Bei Kombinationen mit "w" sollte die Länge bzw. der Wertebereich des Datentyps in der ersten SELECT-Liste ausreichend für alle folgenden SELECT-Listen sein. Es kommt zu einer Warnung von der Syntaxprüfung, wenn dies nicht der Fall ist.
  • Bei Kombinationen mit "l" müssen die Längen der Datentypen genau übereinstimmen.

Wenn bei einer Kombination mit "w" die Länge bzw. der Wertebereich des ersten Elements nicht die folgenden Elemente abdeckt, kann der von der Datenbank zurück gegebene Wert zu groß für den Datentyp des Elements der CDS-Entität sein. Die View ist dann zwar aktivierbar, bei einem Zugriff mit einer Query in kann es aber gemäß der Zuweisungsregeln der INTO-Klausel zum Abschneiden von Inhalt oder zu Ausnahmen kommen, falls mit einem Typbezug auf die Entität gearbeitet wird. Zuweisungen an ABAP-Datenobjekte mit genügend großem Wertebereich sind dagegen problemlos möglich.

Eine CDS-View, in der mit UNION Vereinigungsmengen gebildet werden, kann CDS-Assoziationen exponieren. Eine solche CDS-Assoziation muss in allen mit UNION vereinigten SELECT-Anweisungen gleichartig definiert und exponiert werden, d.h., CDS-Assoziationen, die in den jeweiligen SELECT-Listen veröffentlicht werden, müssen in allen mit UNION vereinigten SELECT-Anweisungen vorkommen und dort

  • den gleichen Namen haben,
  • die gleiche Kardinalität haben,
  • die gleichen ON-Bedingungen haben, d.h.
  • die Bedingungen müssen sich auf die gleichen Felder in Ausgangs- und Zieldatenquelle beziehen und für diese die gleiche Logik ausdrücken,

  • die in Bedingungen aufgeführten Felder der Ausgangsdatenquelle müssen jeweils an identischen Positionen in der SELECT-Liste stehen.

Diese Regeln gelten auch, wenn eine CDS-Assoziation in einer Datenquelle einer SELECT-Anweisung definiert ist und von der aktuellen Anweisung exponiert wird. Die in den einzelnen SELECT-Listen veröffentlichten gleichnamigen CDS-Assoziationen wirken von außen wie eine von der Vereinigungsmenge veröffentlichte CDS-Assoziation. Für CDS-Assoziationen, die nicht in den SELECT-Listen veröffentlicht werden, gibt es keine Einschränkungen.

Hinweise

  • Vereinigungsmengen können sinnvoll sein, um nicht normalisierte Datenbanktabellen in einen normalisierten View auf die Daten zu überführen.
  • Wenn die Länge oder der Wertebereich eines Elements aus der SELECT-Liste der ersten SELECT-Anweisung nicht die der zugehörigen Elemente der folgenden SELECT-Anweisungen abdeckt, wird empfohlen, einen ausreichenden Typ mit einem geeigneten CAST-Ausdruck festzulegen.
  • Die maximale Anzahl verschiedener SELECT-Anweisungen, die mit UNION vereinigt werden können, hängt vom Datenbanksystem ab. Wenn diese Anzahl überschritten wird, kann die CDS-View nicht aktiviert werden.

Beispiele

Vereinigungsmenge ohne Namensliste. Die Elementnamen der SELECT-Listen müssen übereinstimmen.

@AbapCatalog.sqlViewName: '...'
define view ... as
  select
    from demo_join1
      { a as c1, b as c2, c as c3, d as c4 }
    union
      select
        from demo_join2
          { d as c1, e as c2, f as c3, g as c4 }

Vereinigungsmenge mit Namensliste. Die Elementnamen der SELECT-Listen müssen nicht übereinstimmen.

@AbapCatalog.sqlViewName: '...'
define view ... ( c1, c2, c3, c4 ) as
  select
    from demo_join1
      { a, b, c, d }
    union
      select
        from demo_join2
          { d, e, f, g }

Beispiel

Die folgende CDS-View vereinigt die Ergebnismengen zweier SELECT-Anweisungen. Das Element col1 der ersten SELECT-Liste ist vom Typ INT4 während das zugehörige Element col1 der zweiten SELECT-Liste vom Typ INT8 ist. Deshalb kommt es zu einer Warnung von der Syntaxprüfung. Für das zweite Element col2 wird demonstriert, wie die Warnung durch einen CAST auf den Typ INT8 umgangen werden kann.

Das Programm DEMO_CDS_UNION_ELEMENT_TYPE greift viermal mit SELECT auf die View zu:

  • Im ersten Zugriff wird direkt in eine interne Tabelle vom Zeilentyp der CDS-Entität geschrieben. Da der Wert des Elements col1 in den Wertebereich von Datentyp i passt, ist der Zugriff erfolgreich.
  • Der zweite Zugriff erfolgt wie der erste Zugriff, ein Wert im Element col1 ist aber außerhalb des Wertebereichs des Datentyps i der ersten Spalte der internen Tabelle result2. Deshalb kommt es zu einer Ausnahme.
  • Im dritten Zugriff wird die Ausnahme verhindert, da der Datentyp der ersten Spalte der Ergebnismenge und damit auch der internen Tabelle result3 durch einen CAST in auf int8 erweitert wird.
  • Im vierten Zugriff wird die Ausnahme dadurch verhindert, dass der Datentyp der ersten Spalte der internen Tabelle result4 ausreichend deklariert ist.

Die Behandlung des zweiten Elements über einen CAST in der CDS-View ist aber in allen Fällen die empfohlene Vorgehensweise.






CL_GUI_FRONTEND_SERVICES - Frontend Services   ABAP Short Reference  
Diese Dokumentation steht unter dem Copyright der SAP AG.

Length: 28763 Date: 20240523 Time: 171148     sap01-206 ( 273 ms )