重构旧程序至S4/HANA:能否将多段OPEN SQL合并为单条查询?
S4/HANA迁移中ABAP查询合并问题解答
问题描述
我正在将旧程序重构迁移至S4/HANA系统,目前卡在以下代码处:
LOOP AT ITAB. CLEAR lv_stufe. SELECT SINGLE stufe FROM prps INTO lv_stufe WHERE pspnr = itab-projk . IF lv_stufe <> '1'. CLEAR : lv_up. SELECT SINGLE up FROM prhi INTO lv_up WHERE posnr = itab-projk . CLEAR : lv_up1. SELECT SINGLE up FROM prhi INTO lv_up1 WHERE posnr = lv_up. CLEAR itab-prart. SELECT SINGLE prart FROM prps INTO itab-prart WHERE pspnr = lv_up1. ENDIF. ENDLOOP
请问能否将这些查询合并为单条SELECT语句?
另外,感谢Sandra的帮助,我认为以下代码可解决问题(已调整ITAB并将创建GT表),想确认该写法是否可行,唯一疑问是应使用LEFT JOIN还是INNER JOIN,我认为应使用INNER JOIN:
select from prps inner join prhi on prps~posnr = prhi~posnr left join prhi as prhi2 on prhi~up = prhi2~posnr fields prps~prart where prps~stufe <> 1 and prps~posnr = @itab-projk into @itab-prart.
解答
1. 能否合并为单条SELECT语句?
完全可以,而且强烈建议这么做。原代码在LOOP循环内嵌套多次SELECT SINGLE,属于典型的"N+1查询",会导致大量数据库交互,严重影响程序性能,尤其在数据量较大的场景下。合并为单条关联查询能大幅减少数据库请求次数,提升执行效率。
2. 代码可行性与JOIN类型选择
你的写法方向正确,但需要调整关联逻辑以匹配原业务流程,同时明确JOIN类型的适用场景:
- 关联逻辑修正:原逻辑是从
itab-projk出发,先取prps的stufe,再通过prhi两次向上追溯父节点,最后用最终的父节点编号取prps的prart。你当前的代码关联链起点偏差,正确的关联应该是:以itab-projk对应prps记录为起始,关联prhi获取第一层父节点,再关联prhi2获取第二层父节点,最后关联另一张prps表获取目标prart。 - JOIN类型选择:
- 若业务上保证:只要
prps-stufe <> '1',就一定存在对应的prhi、prhi2以及最终的prps记录,用INNER JOIN是合适的,只会返回关联链完整的数据。 - 若存在关联链断裂的情况(比如某条
itab-projk找不到对应的prhi,或prhi-up找不到prhi2),且需要保留这些记录(此时prart为空),则必须用LEFT JOIN——原逻辑中即使查询不到数据,也会保留itab的其他字段,仅prart为空,用LEFT JOIN才能完全匹配原逻辑的行为。
- 若业务上保证:只要
3. 优化后的参考代码
SELECT prps_final~prart FROM prps AS prps_initial INNER JOIN prhi AS prhi1 ON prhi1~posnr = prps_initial~pspnr LEFT JOIN prhi AS prhi2 ON prhi2~posnr = prhi1~up LEFT JOIN prps AS prps_final ON prps_final~pspnr = prhi2~up WHERE prps_initial~stufe <> '1' AND prps_initial~pspnr = @itab-projk INTO @itab-prart.
(注:若业务确认所有关联节点必然存在,可将LEFT JOIN替换为INNER JOIN)
内容的提问来源于stack exchange,提问作者ekekakos
相关产品推荐
相关产品推荐

