You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何LEFT JOIN表现如INNER JOIN?附ABAP查询代码求助

问题原因分析

你的LEFT JOIN表现得像INNER JOIN,核心原因是WHERE子句中对右表(zkrh_scmt_invh)字段的过滤条件,会直接排除左表中没有匹配右表的行。
当左表@it_selected_data的某行在右表中找不到对应的ebeln时,invh~invkind的值为NULL,而NULL = (子查询结果)的判断永远不成立,导致这些行被WHERE条件过滤掉,最终结果就和INNER JOIN一致了。

解决方案

有两种常用的修正方式:

方式一:将过滤条件移至LEFT JOIN的ON子句中

把原本在WHERE里的子查询条件放到关联条件里,这样只会影响右表的匹配逻辑,不会过滤左表无匹配的行:

SELECT FROM @it_selected_data AS selected
      LEFT JOIN zkrh_scmt_invh AS invh
        ON invh~ebeln = selected~ebeln
       AND invh~invkind = ( SELECT MAX( invkind ) FROM zkrh_scmt_invh WHERE ebeln = invh~ebeln )
    FIELDS selected~*, invh~invkind
    INTO CORRESPONDING FIELDS OF TABLE @it_final_data.

方式二:先预查询右表的最大invkind数据,再做关联

先把每个ebeln对应的最大invkind单独查出来,再和左表做LEFT JOIN,逻辑更清晰:

DATA: lt_max_invk TYPE TABLE OF zkrh_scmt_invh.

SELECT ebeln, MAX( invkind ) AS invkind
  FROM zkrh_scmt_invh
 GROUP BY ebeln
  INTO CORRESPONDING FIELDS OF TABLE @lt_max_invk.

SELECT FROM @it_selected_data AS selected
      LEFT JOIN @lt_max_invk AS max_inv
        ON max_inv~ebeln = selected~ebeln
    FIELDS selected~*, max_inv~invkind
    INTO CORRESPONDING FIELDS OF TABLE @it_final_data.

内容的提问来源于stack exchange,提问作者ekekakos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 18:15:57