为何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
相关产品推荐
相关产品推荐

