Code: Alles auswählen.
SELECT-OPTIONS: s_carrn FOR ls_scarr-carrname.
SELECT a~CARRID, a~CONNID, b~CURRENCY
c~CARRNAME
FROM SPFLI as a
LEFT JOIN SFLIGHT as b
ON a~carrid = b~carrid
AND a~connid = b~connid
LEFT JOIN SCARR as c
ON a~carrid = c~carrid
INTO TABLE @DATA(itab)
WHERE " hier am besten CARRNAME IN @s_carrn, das wäre das beste, darf ja nicht gemacht werden
Code: Alles auswählen.
SELECT-OPTIONS: s_carrn FOR ls_scarr-carrname.
SELECT a~CARRID, a~CONNID, b~CURRENCY
c~CARRNAME
FROM SPFLI as a
LEFT JOIN SFLIGHT as b
ON a~carrid = b~carrid
AND a~connid = b~connid
LEFT JOIN SCARR as c
ON a~carrid = c~carrid
INTO TABLE @DATA(itab)
WHERE c~carrname IN @s_carrn OR c~carrname IS NULL.
Code: Alles auswählen.
IF space IN s_carrn[].
SELECT a~CARRID, a~CONNID, b~CURRENCY
c~CARRNAME
FROM SPFLI as a
LEFT JOIN SFLIGHT as b
ON a~carrid = b~carrid
AND a~connid = b~connid
LEFT JOIN SCARR as c
ON a~carrid = c~carrid
INTO TABLE @DATA(itab)
WHERE c~carrname IN @s_carrn OR c~carrname IS NULL.
ELSE.
SELECT a~CARRID, a~CONNID, b~CURRENCY
c~CARRNAME
FROM SPFLI as a
LEFT JOIN SFLIGHT as b
ON a~carrid = b~carrid
AND a~connid = b~connid
LEFT JOIN SCARR as c
ON a~carrid = c~carrid
INTO TABLE @DATA(itab)
WHERE c~carrname IN @s_carrn.
ENDIF.
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
ABAPlerv
Das behebt evtl. der COALESCE-Befehl?a-dead-trousers hat geschrieben: ↑18.05.2022 21:36Wenn der Benutzer die Abfrage auf NULL z.B. mit einem eigenen Leereintrag (SIGN = 'I' OPTION = 'EQ' LOW = '') steuern können soll, dann muss man das mit zwei getrennten SELECTs machen:
Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
a-dead-trousers
a-dead-trousers hat geschrieben: ↑18.05.2022 21:36Hi.
Ab Basis 7.50 ist es möglich auch die rechte Seite in einem left outer join abzufragen.
Zu bechaten ist nur das spezielle Verhalten in diesem Fall in Zusammenspiel mit dem IN Operator. Wenn die Range-Tabelle (Select-option) leer ist, gibt es keine Probleme, weil dann die Bedingung sowieso ignoriert wird. Wenn man aber zusammen mit Werten von beiden Seiten des Joins auch jene haben möchte die auf der rechten Seite nicht vorhanden (NULL) sind, wird es etwas tricky. Da ABAP grundsätzlich kein NULL in der internen Verarbeitung kennt, muss man die Abfrage dann etwas anders formulieren:Wenn der Benutzer die Abfrage auf NULL z.B. mit einem eigenen Leereintrag (SIGN = 'I' OPTION = 'EQ' LOW = '') steuern können soll, dann muss man das mit zwei getrennten SELECTs machen:Code: Alles auswählen.
SELECT-OPTIONS: s_carrn FOR ls_scarr-carrname. SELECT a~CARRID, a~CONNID, b~CURRENCY c~CARRNAME FROM SPFLI as a LEFT JOIN SFLIGHT as b ON a~carrid = b~carrid AND a~connid = b~connid LEFT JOIN SCARR as c ON a~carrid = c~carrid INTO TABLE @DATA(itab) WHERE c~carrname IN @s_carrn OR c~carrname IS NULL.
lg ADTCode: Alles auswählen.
IF space IN s_carrn[]. SELECT a~CARRID, a~CONNID, b~CURRENCY c~CARRNAME FROM SPFLI as a LEFT JOIN SFLIGHT as b ON a~carrid = b~carrid AND a~connid = b~connid LEFT JOIN SCARR as c ON a~carrid = c~carrid INTO TABLE @DATA(itab) WHERE c~carrname IN @s_carrn OR c~carrname IS NULL. ELSE. SELECT a~CARRID, a~CONNID, b~CURRENCY c~CARRNAME FROM SPFLI as a LEFT JOIN SFLIGHT as b ON a~carrid = b~carrid AND a~connid = b~connid LEFT JOIN SCARR as c ON a~carrid = c~carrid INTO TABLE @DATA(itab) WHERE c~carrname IN @s_carrn. ENDIF.
Code: Alles auswählen.
select ....
...
..
..
LEFT JOIN SCARR as c
ON c~carrname = @'Lufthansa'....
Das klappt nicht, weil damit SPFLI über den CARRID-Schlüssel nicht mehr korrekt mit der SCARR gejoint wird. ( Du erhältst jetzt Treffer, die Werte <> "Lufthansa" in SPFLI-CARRID enthalten ).ABAPlerv hat geschrieben: ↑19.05.2022 11:29Wenn s_carrn ein einzelner Werte wäre zum Beispiel 'Lufthansa', könnte man doch auch im ON Bedingung schreiben oder?
Code: Alles auswählen.
select .... ... .. .. LEFT JOIN SCARR as c ON c~carrname = @'Lufthansa'....
Zunächst einmal muss man festhalten, dass in deinem Fall CARRID ein Schlüsselfeld von SCARR ist und weiterhin in der JOIN-Bedingung auftaucht. Wenn du von der Konsistenz der Daten im Rahmen des Flugdatenmodells ausgehst sollte somit niemals ein Datensatz existieren, bei dem die Bedingung fehlschlägt, so dass du eigentlich auch gleich einen LEFT JOIN verwenden kannst und dann kannst du auch die Selopt gleich in die 1. Tabelle nach vorne ziehen, wo CARRID angesprochen wird und die SCARR wird lediglich zum weiteren Datenfüllen verwendet.
a-dead-trousers hat geschrieben: ↑18.05.2022 21:36Hi.
Ab Basis 7.50 ist es möglich auch die rechte Seite in einem left outer join abzufragen.
Zu bechaten ist nur das spezielle Verhalten in diesem Fall in Zusammenspiel mit dem IN Operator. Wenn die Range-Tabelle (Select-option) leer ist, gibt es keine Probleme, weil dann die Bedingung sowieso ignoriert wird. Wenn man aber zusammen mit Werten von beiden Seiten des Joins auch jene haben möchte die auf der rechten Seite nicht vorhanden (NULL) sind, wird es etwas tricky. Da ABAP grundsätzlich kein NULL in der internen Verarbeitung kennt, muss man die Abfrage dann etwas anders formulieren:Wenn der Benutzer die Abfrage auf NULL z.B. mit einem eigenen Leereintrag (SIGN = 'I' OPTION = 'EQ' LOW = '') steuern können soll, dann muss man das mit zwei getrennten SELECTs machen:Code: Alles auswählen.
SELECT-OPTIONS: s_carrn FOR ls_scarr-carrname. SELECT a~CARRID, a~CONNID, b~CURRENCY c~CARRNAME FROM SPFLI as a LEFT JOIN SFLIGHT as b ON a~carrid = b~carrid AND a~connid = b~connid LEFT JOIN SCARR as c ON a~carrid = c~carrid INTO TABLE @DATA(itab) WHERE c~carrname IN @s_carrn OR c~carrname IS NULL.
lg ADTCode: Alles auswählen.
IF space IN s_carrn[]. SELECT a~CARRID, a~CONNID, b~CURRENCY c~CARRNAME FROM SPFLI as a LEFT JOIN SFLIGHT as b ON a~carrid = b~carrid AND a~connid = b~connid LEFT JOIN SCARR as c ON a~carrid = c~carrid INTO TABLE @DATA(itab) WHERE c~carrname IN @s_carrn OR c~carrname IS NULL. ELSE. SELECT a~CARRID, a~CONNID, b~CURRENCY c~CARRNAME FROM SPFLI as a LEFT JOIN SFLIGHT as b ON a~carrid = b~carrid AND a~connid = b~connid LEFT JOIN SCARR as c ON a~carrid = c~carrid INTO TABLE @DATA(itab) WHERE c~carrname IN @s_carrn. ENDIF.
Code: Alles auswählen.
SELECT-OPTIONS: s_carrn FOR ls_scarr-carrname.
SELECT a~CARRID, a~CONNID, b~CURRENCY
c~CARRNAME
FROM SPFLI as a
LEFT JOIN SFLIGHT as b
ON a~carrid = b~carrid
AND a~connid = b~connid
LEFT JOIN SCARR as c
ON a~carrid = c~carrid
INTO TABLE @DATA(itab)
WHERE c~carrname IN @s_carrn OR c~carrname IS NULL.
Das Problem ist, wenn auf der "rechten Seite" des JOIN nichts vorhanden ist. Dann sind alls Felder auf NULL zu prüfen, wenn du von der "linken Seite" trotzdem etwas haben möchtest.
Hier kommt nun eine Spezialität von ABAP zum Zug. Weil ABAP kein NULL kennt werden alle Felder der "rechten Tabelle" im Ergebnis als "leer" oder "initial" befüllt. (CHAR => space, INT => 0, usw.). Daher verhällt sich der LOOP anders als die Abfrage direkt im SELECT.
Code: Alles auswählen.
select " Felder...
FROM A LEFT JOIN B
On .......
LEFT JOIN C
On A~ = C~
Code: Alles auswählen.
select " Felder...
FROM A LEFT JOIN B
On .......
LEFT JOIN C
On B~ = C~
Code: Alles auswählen.
select " Felder...
FROM A LEFT JOIN B
On .......
INNER JOIN C
On A~ = C~
Code: Alles auswählen.
select " Felder...
FROM A LEFT JOIN B
On .......
INNER JOIN C
On B~ = C~
Code: Alles auswählen.
select " Felder...
FROM A INNER JOIN B
On .......
INNER JOIN C
On A~ = C~
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
ABAPlerv
Danke! hat mir sehr weitergeholfen!a-dead-trousers hat geschrieben: ↑13.11.2022 12:072.) Wenn der Join für B nichts findet wird auch für C nichts zusätzliches selektiert.
ABAPlerv hat geschrieben: ↑13.11.2022 14:35Danke! hat mir sehr weitergeholfen!a-dead-trousers hat geschrieben: ↑13.11.2022 12:072.) Wenn der Join für B nichts findet wird auch für C nichts zusätzliches selektiert.
Punkt 2 ist mir nicht ganz klar.
Beim 2. JOIN (B und C) werden alle Zeilen von B betrachtet - also unabhängig von A?
Oder werden nur die Zeilen von B betrachtet, die schon von A un B betrachtet worden sind?
Darf man das überhaupt von LINKS nach rechts lesen?
Es werden genau dieselben "Probleme" auftreten. Einzger Unterschied ist, dass die CDS Views etwas mehr Funktionen bieten als der ABAP Standard. Das Verhalten der JOINs wird hier aber genau gleich sein, weil ja auch die gleiche Datenbank verwendet wird.