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 EKPO
在WHERE
中不被接受,因为如果连接结果只有一些行从左侧 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).
我想创建一个左连接多个 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 EKPO
在WHERE
中不被接受,因为如果连接结果只有一些行从左侧 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).