【问题标题】:SELECT FROM DB_TABLE with left join where column from joined tableSELECT FROM DB_TABLE with left join where column from join table
【发布时间】:2019-04-10 18:14:30
【问题描述】:

我想创建一个左连接多个表的选择。

在下面的代码中,我只需要选择表EKPO 的行,其中列EBELN = 变量lv_ebeln。但是一旦我将此条件添加到WHERE,我就会收到以下语法错误:

“SELECT LIST”列表中的元素必须用逗号分隔。

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

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.

【问题讨论】:

  • 我编辑了消息,使代码为MCVE,我删除了有关性能的部分,因为这是一个不同的问题。欢迎单独询问。
  • WHERE 条件很明显,您需要的是INNER JOIN 而不是LEFT (OUTER) JOIN

标签: abap opensql


【解决方案1】:

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

真正的错误是,在左外连接中,右表EKPO 上的条件在WHERE 中不被接受,因为如果连接结果只有左表RSEG 中的某些行,则列来自右表的EKPO 将具有值null,因此基于右表列的条件为假并且未选择行,使得左外连接的行为类似于内连接。

  • 要么使用带有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). 

【讨论】:

  • 您在 ABAP 文档中找不到它,因为这些是 SQL 基础知识。
猜你喜欢
  • 1970-01-01
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-06
  • 1970-01-01
相关资源
最近更新 更多