'INNER JOIN with 'OR' condition?

If have the following coding and the bold marked line is the problem, so it seems to be that's it not possible to use the "OR"-statement within a Inner Join select "ON":

PARAMETERS: 
pa_abgrs TYPE vbap-abgrs DEFAULT 'YV0001',  
pa_kokrs TYPE kokrs OBLIGATORY DEFAULT '0002',
pa_monat TYPE bis_abgr_m OBLIGATORY,
pa_gjahr TYPE bis_abgr_j OBLIGATORY.

DATA:   hlp_datum          TYPE sy-datum. 
CONSTANTS: comp_nine(20) TYPE c VALUE '09182736455463728190'.

TYPES: BEGIN OF t_tkkaz_tkkar,
             kateg TYPE kategorie,
             zlnid TYPE dzeilen_id,
             koamk TYPE kstar_mask,          " Kostenart
             zidap TYPE dzeilen_id,          " Zeilen-ID akt.pflichtig
             zidnf TYPE dzlnid_naf,          " Zeilen-ID nicht akt.pfl.
             nafpz TYPE naf_prz,             " nicht akt.f.%-Satz
           END OF t_tkkaz_tkkar.
    DATA: lt_tkkaz_tkkar TYPE TABLE OF t_tkkaz_tkkar.

  CONCATENATE pa_gjahr pa_gjahr INTO hlp_datum.
  TRANSLATE hlp_datum USING comp_nine.

   SELECT tkkar~kateg tkkar~zlnid tkkaz~koamk tkkaz~zidap tkkaz~zidnf       
            tkkaz~nafpz
      FROM tkkar
      INNER JOIN tkkaz
      ON  tkkaz~zidnf = tkkar~zlnid
      OR  tkkaz~zidap = tkkar~zlnid   "<====  THIS LINE
      INTO TABLE lt_tkkaz_tkkar
      WHERE  tkkar~kokrs  = pa_kokrs
      AND    tkkar~versa  = '000'        
      AND    tkkar~abgsl  = pa_abgrs
      AND  ( tkkar~kateg  = 'E'         
      OR     tkkar~kateg  = 'K' )       
      AND   tkkaz~kokrs  = pa_kokrs
      AND    tkkaz~versa  = '000'
      AND    tkkaz~abgsl  = pa_abgrs.
      AND    tkkaz~zglab  GE hlp_datum.

IF sy-subrc = 0.
cl_demo_output=>display( lt_tkkaz_tkkar )
ENDIf.


Solution 1:[1]

It is not supported in ABAP, use UNION instead. It has the same semantics

  SELECT FROM tkkar
         FIELDS tkkar~kateg tkkar~zlnid tkkaz~koamk tkkaz~zidap tkkaz~zidnf tkkaz~nafpz
   INNER JOIN tkkaz
      ON tkkar~zlnid = tkkaz~zidnf
   WHERE ...
  UNION 
 SELECT FROM tkkar
        FIELDS tkkar~kateg tkkar~zlnid tkkaz~koamk tkkaz~zidap tkkaz~zidnf tkkaz~nafpz
  INNER JOIN tkkaz
     ON tkkar~zlnid = tkkaz~zidap

Also your query is wrong because you missed the key fields while joining. In fact you don't even need UNION here, you can achieve the same putting OR condition into WHERE clause and keeping the other JOIN fields making it more inclusive:

SELECT tkkar~kateg tkkar~zlnid tkkaz~koamk tkkaz~zidap tkkaz~zidnf tkkaz~nafpz
  FROM tkkar
 INNER JOIN tkkaz
    ON tkkar~kokrs = tkkaz~kokrs
   AND tkkar~versa = tkkaz~versa
   AND tkkar~abgsl = tkkaz~abgsl
  INTO TABLE lt_tkkaz_tkkar
 WHERE tkkar~kokrs = pa_kokrs
   AND tkkar~versa = '000'
   AND tkkar~abgsl = pa_abgrs
   AND tkkar~kateg IN ('E','K')
   AND tkkaz~zglab GE hlp_datum.
   AND ( tkkar~zlnid = tkkaz~zidnf OR tkkar~zlnid = tkkaz~zidap ).

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Suncatcher