Im Jahr 1999 wurde die vierte Überarbeitung von SQL unter dem Namen SQL:1999 bzw. SQL3 publiziert. Unter anderem wurden mit SQL:1999 das WITH Konstrukt zur Verwendung von Common Table Expression eingeführt.
Eine Common Table Expression (CTE) erzeugt eine tabellarische Ergebnisliste welche nur temporär innerhalb einer SQL-Operation zur Verfügung steht.
Die Verwendung ist dann sinnvoll, wenn man z.B. Zwischenergebnisse benötigt, eine komplexe SQL-Anweisung übersichtlicher strukturieren will oder wenn die Zwischenergebnisse mehrfach benötigt werden.
Gerade wenn man sich um Clean Code bemüht, sollten auch CTE zur besseren Lesbarkeit eingesetzt werden.
Ab dem ABAP Release 7.51 stehen die Common Table Expressions nun auch für uns ABAP Entwickler zur Verfüfung.
Syntax
Die Syntax ist recht einfach. Eingeleitet werden CTEs mit WITH:
1 2 3 |
WITH +ctename1[( name1, name2, … )] AS ( SELECT <subquery> )[, +ctename2[( name1, name2, … )] AS ( SELECT <subquery> ), … ] SELECT <mainquery> … [ENDWITH]</mainquery></subquery></subquery> |
- Durch die optionale Angabe der Spaltennamen mit ( name1, name2, … ) direkt im Anschluss an den CTE Namen, können die Spaltennamen in der CTE Ergebnisliste überschrieben werden
- Die CTEs müssen in der Hauptabfrage verwendet werden
Beispiele
Im nachfolgenden Beispiel werden Personen und Unternehmen mit CTEs gelesen. Im SELECT werden diese beiden CTEs mit der Relationstabelle BUT050 verknüpft.
1 2 3 4 5 6 |
with +people( partner, name_last, name_first ) as ( select partner, name_last, name_first from but000 where type = '1' ), +companies( partner, name ) as ( select partner, CONCAT_WITH_SPACE( name_org1, name_org2, 1 ) as name from but000 where type = '2' ) select * from +companies as a inner join but050 as b on b~partner1 = a~partner inner join +people as c on c~partner = b~partner2 into table @data(result). |
In diesem Beispiel wird das Ergebnis der CTE als Subselect im SELECT verwendet.
1 2 3 |
with +people( partner, bpkind ) as ( select partner, bpkind from but000 where type = '1' ) select * from but050 where partner2 in ( select partner from +people where bpkind = @space ) into table @data(result2). |
Ergänzende Hinweise
- Mit dem WITH Kommando wird die SAP-Pufferung umgangen
- Sobald man WITH verwendet, wird die Syntaxprüfung mit strikten Modus 7.51 ausgeführt
- ENDWITH ist ggf. gleich einzusetzen wie ENDSELECT
- In der SAP Dokumentation sind die CTEs als „allgemeine Tabellenausrücke“ übersetzt
Links
- SAP Schlüsselwortdokumentation
- SDN Blog von Horst Keller anlässlich der CTE Einführung