SELECT FROM DB_TABLE 使用左连接,其中列来自连接 table

SELECT FROM DB_TABLE with left join where column from joined table

我想创建一个左连接多个 table 的 select。

在下面的代码中,我只需要 select table EKPO 行,其中列 EBELN = 变量 lv_ebeln。但是一旦我将这个条件添加到 WHERE,我就会得到这个语法错误:

The elements in the "SELECT LIST" list must be separated using commas.

那么,有没有办法添加这个条件?

DATA: BEGIN OF wa_itab,
        gjahr TYPE rseg-gjahr,
        ebelp TYPE ekpo-ebelp,
      END OF wa_itab,
      itab     LIKE TABLE OF wa_itab,
      lv_belnr TYPE rseg-belnr,
      lv_ebeln TYPE ekpo-ebeln.

SELECT rseg~gjahr ekpo~ebelp FROM rseg
  LEFT JOIN ekpo ON rseg~ebeln = ekpo~ebeln AND rseg~ebelp = ekpo~ebelp
  INTO (wa_itab-gjahr, wa_itab-ebelp )
  WHERE rseg~belnr = lv_belnr 
    AND ekpo~ebeln = lv_ebeln. " <=== SYNTAX ERROR because of this line

  ...
  " some other code
  ...

  APPEND wa_itab TO itab.
ENDSELECT.

语法错误信息具有误导性,不需要逗号,因为问题与 OpenSQL strict mode.

无关

真正的错误是在左外连接中,右边的条件table EKPOWHERE中不被接受,因为如果连接结果只有一些行从左侧 table RSEG,右侧 table EKPO 的列将具有值 null,因此条件基于右侧 table 列为假且未选择行,使左外连接的行为类似于内连接。

  • 或者你使用一个内部连接与 WHERE 中的条件(你不想要的)。
  • 或者您保留左外连接并将条件移动到 ON 连接条件,如下所示。

代码:

SELECT rseg~gjahr ekpo~ebelp FROM rseg
  LEFT JOIN ekpo ON rseg~ebeln = ekpo~ebeln 
                AND rseg~ebelp = ekpo~ebelp
                AND ekpo~ebeln = lv_ebeln " <=== move it here
  INTO (wa_itab-gjahr, wa_itab-ebelp )
  WHERE rseg~belnr = lv_belnr.

PS:我没有在 ABAP 文档中找到正式解释它的参考资料,除了 close example:

SELECT s~carrid, s~carrname 
   FROM scarr AS s 
   LEFT OUTER JOIN spfli AS p ON s~carrid   =  p~carrid 
                              AND p~cityfrom = @cityfr  " <=== not in the WHERE
   WHERE p~connid IS NULL 
   ORDER BY s~carrid, s~carrname 
   INTO TABLE @DATA(itab).