ABAP 7.52:结合CTE与SELECT CASE实现字段赋值求助
ABAP SQL语句修正:基于多表匹配填充字段
需求说明
现有三张表:
- Z_TAB1:包含MATKL(物料组)、FLAG(CHAR1类型)字段
- LIPS:交货行项目表
- MARA:物料主数据表
需生成结果表,包含MATNR(物料编号)、LFIMG(交货数量)以及一个值为'X'或空的字段,赋值逻辑如下:
当MARA-MHDHB不为初始值,或者**MARA-MATKL存在于Z_TAB1的MATKL且对应Z_TAB1-FLAG = 'X'**时,该字段赋值为'X',否则为空。
原语句问题分析
原语句存在以下错误:
- CTE引用时字段拼写错误(
maktl应为matkl),且无法直接用IN关联CTE字段判断条件 - ELSE分支用
'-'不符合需求的“为空”要求 - ABAP SQL中CTE定义无需加
+前缀
修正后的SQL语句
WITH tab1 AS ( SELECT matkl, flag FROM z_tab1 WHERE flag = 'X' -- 提前过滤符合FLAG条件的记录,优化查询性能 ) SELECT lips~matnr, lips~lfimg, CASE WHEN (mara~mhdhb IS NOT INITIAL) OR EXISTS (SELECT 1 FROM tab1 WHERE tab1~matkl = mara~matkl) THEN 'X' ELSE '' -- 符合需求的空值返回 END AS result_field INTO TABLE @DATA(i_tab) FROM lips INNER JOIN mara ON lips~matnr = mara~matnr.
修正说明
- 提前在CTE中过滤
FLAG='X'的记录,减少后续子查询的数据处理量 - 用
EXISTS子查询替代原错误的关联方式,准确判断当前物料组是否存在符合条件的Z_TAB1记录 - 修正字段拼写错误,调整ELSE分支返回空字符串以匹配需求
内容的提问来源于stack exchange,提问作者kdobrev
相关产品推荐
相关产品推荐

