Ansicht
Dokumentation

ABENCDS_JOINED_DATA_SOURCE_V1 - CDS JOINED DATA SOURCE V1

ABENCDS_JOINED_DATA_SOURCE_V1 - CDS JOINED DATA SOURCE V1

Addresses (Business Address Services)   Fill RESBD Structure from EBP Component Structure  
Diese Dokumentation steht unter dem Copyright der SAP AG.
SAP E-Book

- DDIC-basierte View, SELECT, JOIN

... ${ $[INNER$] JOIN $}$|${ LEFT$|RIGHT OUTER $[TO ONE$|MANY$] JOIN $}$|${ CROSS JOIN $}
      data_source $[ON cds_cond$] ...


Zusätze:

1. ... ON cds_cond

2. ... TO ONE$|MANY

Wirkung

Definiert einen Join zwischen zwei Datenquellen einer . Die obige Angabe ist Teil der Syntax einer Datenquelle data_source und enthält rekursiv wieder die Syntax einer Datenquelle data_source. Zwei verknüpfte Datenquelle stellen einen Join-Ausdruck dar.

Jeder Join-Ausdruck für einen Inner- oder Outer-Join muss eine Join-Bedingung cds_cond hinter ON enthalten (Details siehe Zusatz 1 unten). Ein Join-Ausdruck für einen Cross-Join darf keine Join-Bedingung enthalten.

Inner-Joins, Outer-Joins, and Cross-Joins sind möglich:

  • Eine Verknüpfung von zwei Datenquellen mit INNER JOIN oder nur JOIN selektiert alle Einträge der Datenquellen, deren Felder die ON-Bedingung erfüllen.
  • Eine Verknüpfung von zwei Datenquellen mit LEFT OUTER JOIN selektiert alle Einträge der linken Seite. Eine Verknüpfung von zwei Datenquellen mit RIGHT OUTER JOIN selektiert alle Einträge der rechten Seite. Für die Einträge, für welche die ON-Bedingung erfüllt ist, ist der Inhalt der gleiche wie beim Inner-Join. In Einträgen, die die ON-Bedingung nicht erfüllen, haben die Elemente auf der rechten oder linken Seite den Null-Wert. Wenn die CDS-View in verwendet wird, werden Null-Werte auf den typabhängigen Initialwert gesetzt.
  • Eine Verknüpfung von zwei Datenquellen mit CROSS JOIN bildet deren Kreuzprodukt. Es werden alle Einträge der linken Seite mit allen Einträgen der rechten Seite kombiniert. Die Anzahl der Zeilen der Ergebnismenge ist die Anzahl der Zeilen der linken Seite multipliziert mit der Anzahl der Zeilen der rechten Seite.

Bei gechachtelten Join-Ausdrücken wird die Reihenfolge der Auswertung wie folgt gesteuert:

  • Bei Inner- und Outer-Joins durch die Anordnung der ON-Bedingungen. Von links nach rechts wird jeder JOIN-Verknüpfung die am nächsten stehende ON-Bedingungen zugeordnet und dieser Ausdruck implizit geklammert. Die implizite Klammerung kann mit runden Klammern ( ) verdeutlicht werden. Das ist optional.
  • Cross-Joins werden standardmäßig von links nach rechts ausgewertet. Die Priorität der Auswertung kann durch runde Klammern ( ) beeinflusst werden.
  • Bei der Kombination mehrerer Cross-Joins spielt die Reihenfolge der Auswertung keine Rolle. Das Ergebnis ist immer gleich und die Anzahl der Zeilen ist das Produkt der Zeilenanzahl aller beteiligten Datenquellen.

  • Bei der Kombination von Cross-Joins mit Inner- und Outer-Joins kann das Ergebnis von der Reihenfolge der Auswertung bzw. der Klammerung abhängen.

Hinweise

  • Eine WHERE-Bedingung für eine SELECT-Anweisung mit Joins wirkt auf die durch die Joins gebildete Ergebnismenge.
  • Ein Inner-Join oder ein Cross-Join zwischen zwei einzelnen Datenquellen ist kommutativ. Beim Vertauschen der linken und rechten Seite bleibt das Ergebnis gleich.
  • Eine CDS-View, die einen Outer-Join enthält sollte nicht gepuffert werden. Wegen der möglichen Null-Werte in der Ergebnismenge, kann sich ein Zugriff über sich beim Zugriff auf den Puffer unterschiedlich zum direkten Zugriff auf die Datenbank verhalten, da Null-Werte im Puffer in Initialwerte umgesetzt werden.
  • Um Null-Werte in der Ergebnismenge zu verhindern, kann die Funktion coalesce verwendet werden.
  • Ein Cross-Join wirkt wie ein Inner- oder Outer-Join, dessen ON-Bedingung immer wahr ist. Ein Cross-Join mit einer WHERE-Bedingung hat das gleiche Ergebnis wie ein Inner-Join mit einer gleichlautenden ON-Bedingung. Im Gegensatz zum Inner-Join werden beim Cross-Join aber erst alle Daten gelesen und dann die Bedingung ausgewertet, während beim Inner-Join nur Daten gemäß der ON-Bedingung gelesen werden.
  • Ein Cross-Join sollte nur mit äußerster Vorsicht verwendet werden. Da keine ON-Bedingung angegeben werden kann, werden immer alle Daten aller beteiligten Datenquellen gelesen. Bei großen Datenbeständen kann die Ergebnismenge, deren Zeilenanzahl immer das Produkt aus der Anzahl aller Zeilen beider Datenquellen ist, schnell sehr groß werden.
  • Ein Cross-Join zweier mandantenabhängiger Datenquellen wird auf der Datenbank als Inner-Join ausgeprägt, in dessen ON-Bedingung die Mandantenspalten der linken und rechten Seite auf Gleichheit überprüft werden. Ist eine Seite mandantenunabhängig wird der Cross-Join wie angegeben ausgeprägt.
  • Bei gechachtelten Join-Ausdrücken wird die Verwendung runder Klammern empfohlen, um die Lesbarkeit zu verbessern. Bei Inner- und Outer-Joins können die runden Klammern genau dort angegeben werden, wo die durch die ON-Bedingungen vorgegebene implizite Klammerung erfolgt.
  • Die Anzahl der Join-Ausdrücke einer SELECT-Anweisung einer CDS-View ist in der DDL nicht begrenzt. Es gibt aber eine ATC-Prüfung, die ab einer bestimmten Anzahl eine Meldung ausgibt.

Beispiel

Die folgende CDS-View hat genau die gleiche Funktionalität wie die DDIC-Datenbank-View DEMO_SCARR_SPFLI. Das Programm DEMO_CDS_JOIN greift mit SELECT auf die View zu. Bei einem Zugriff auf die CDS-Entität DEMO_CDS_SCARR_SPFLI wird anders als beim Zugriff auf die DDIC-View DEMO_SCARR_SPFLI aber keine Mandantenspalte zurück gegeben. Die CDS-verwaltete DDIC-View DEMO_CDS_JOIN gibt auch die Mandantenspalte zurück.

Beispiel

Die folgende nicht geklammerte Verkettung von Join-Ausdrücken

... from tab1
      join
        tab2
          join
            tab3 on tab2.id = tab3.id
                 on tab1.id = tab2.id ...

wird implizit wie folgt geklammert:

... from tab1
      join
        ( tab2
            join
              tab3 on tab2.id = tab3.id ) on tab1.id = tab2.id ...

In der inneren ON-Bedingung darf kein Element von tab1 aufgeführt werden.

Beispiel

Die folgende View enthält einen Cross-Join der Tabelle T000 aller Mandanten eines AS ABAP mit den Einträgen für die Nachrichtenklasse SABAPDEMOS in der Tabelle T100. Das Programm DEMO_CDS_CROSS_JOIN greift auf die View zu. Ohne die WHERE-Bedingung wäre die Ergebnismenge sehr groß.

Zusatz 1

... ON cds_cond

Wirkung

Join-Bedingung. Bei einem Inner- oder Outer-Join muss eine Join-Bedingung angegeben werden. Bei einem Cross-Join darf keine Join-Bedingung angegeben werden.

Die Syntax der relationalen Ausdrücke einer Join-Bedingung cds_cond unterliegt folgenden Einschränkungen:

  • Allgemeine Grundregeln
  • Für einen Vergleich mit numerischen Werten dürfen keine Zeichenliterale verwendet werden.

  • Zahlenliterale, die einen Wert außerhalb des Wertebereichs von INT8 darstellen müssen als Gleitpunktliterale mit Dezimalpunkt angegeben werden.

  • Sonderregeln:
  • Alle relationalen Operatoren sind erlaubt. Dies bedeutet, dass alle Vergleichsoperatoren sowie BETWEEN, LIKE, IS [NOT] NULL und IS [NOT] INITIAL erlaubt sind.

Zusatz 2

... TO ONE$|MANY

Wirkung

Angabe der Kardinalität eines Left-Outer-Join. Dieser Zusatz ist hinter LEFT OUTER aber nicht hinter RIGHT OUTER möglich. Er hat nur auf bestimmten Datenbanksystemen eine Wirkung.

Wenn der Zusatz TO ONE angegeben ist, geht eine Datenbank, die den Zusatz unterstützt, davon aus, dass die durch den Left-Outer-Join definierte Ergebnismenge dieser Kardinalität entspricht und der SQL Optimizer versucht, unnötige Joins zu unterdrücken. Wenn die Ergebnismenge nicht der Kardinalität entspricht ist das Ergebnis undefiniert und kann von den Angaben in der SELECT-Liste abhängen. Wenn der Zusatz TO MANY angegeben ist, wird in der Regel keine Optimierung durchgeführt.

Hinweise

  • Für mehr Informationen siehe die Dokumentation des aktuellen Datenbanksystems. Beispielsweise unterstützt die SAP-HANA-Datenbank die Zusätze TO ONE und TO MANY und deren Beschreibung ist Teil der Dokumentation des HANA-spezifischen SQL.
  • Um undefiniertes und plattformabhängiges Verhalten zu vermeiden, darf die Angabe von TO ONE oder TO MANY nur dann erfolgen, wenn die zu lesenden Daten die Voraussetzungen dafür erfüllen.

Beispiel

Falsche Verwendung von TO ONE in CDS-Views. Die Daten in den DDIC-Datenbanktabellen SCARR und SPFLI haben keine Kardinalität TO ONE sondern TO MANY. Zum Beispiel hängt auf einer SAP-HANA-Datenbank das Ergebnis von der SELECT-Liste ab. Wenn dort Spalten der linken und rechten Seite angegeben sind wird keine Optimierung vorgenommen. Wenn keine Spalten der rechten Seite angegeben sind und bei Verwendung der Aggregatfunktion COUNT(*) wird eine Optimierung ausgeführt. Dabei werden nur Daten gelesen, die der vorausgesetzten Kardinalität entsprechen.

Das Programm DEMO_CDS_WRONG_TO_ONE greift auf die CDS-Views zu und stellt die Ergebnisse dar.






TXBHW - Original Tax Base Amount in Local Currency   General Data in Customer Master  
Diese Dokumentation steht unter dem Copyright der SAP AG.

Length: 19406 Date: 20240523 Time: 162350     sap01-206 ( 244 ms )