如何将ABAP中两层嵌套SELECT循环合并为单个SELECT语句?
ABAP嵌套SELECT语句合并方案
实现合并有两种主流方案,具体如下:
方案1:使用INNER JOIN关联查询(推荐)
这种方案直接通过一次数据库关联查询完成数据拉取,和你原有嵌套逻辑完全等价:
" 方式一:直接查询进内表(性能更优,推荐) SELECT * FROM SPFLI INNER JOIN SFLIGHT ON SPFLI~CARRID = SFLIGHT~CARRID AND SPFLI~CONNID = SFLIGHT~CONNID INTO CORRESPONDING FIELDS OF TABLE @DATA(lt_join_result). " 方式二:逐行处理(和原有嵌套循环逐行处理的逻辑完全一致) SELECT * FROM SPFLI INNER JOIN SFLIGHT ON SPFLI~CARRID = SFLIGHT~CARRID AND SPFLI~CONNID = SFLIGHT~CONNID INTO CORRESPONDING FIELDS OF @DATA(ls_join_result). " 此处写你原有内层循环里的业务逻辑即可 ENDSELECT.
注意:如果不需要同时用到两个表的所有字段,建议替换
SELECT *为明确的字段列表,只查询你需要用到的字段,可以有效降低数据传输开销,提升查询性能。如果只需要SFLIGHT表的内容,也可以调整为SELECT SFLIGHT~*来只获取SFLIGHT的字段。
方案2:使用FOR ALL ENTRIES IN语法
如果你场景上不适合用JOIN,可以分两次查询但避免嵌套循环访问数据库:
" 第一步先查询SPFLI数据存入内表 SELECT * FROM SPFLI INTO TABLE @DATA(lt_spfli). " 第二步基于SPFLI内表查询对应的SFLIGHT数据 IF lt_spfli IS NOT INITIAL. SELECT * FROM SFLIGHT INTO TABLE @DATA(lt_sflight) FOR ALL ENTRIES IN @lt_spfli WHERE CARRID = @lt_spfli-CARRID AND CONNID = @lt_spfli-CONNID. ENDIF.
注意:使用
FOR ALL ENTRIES IN前必须判断参照内表非空,否则WHERE条件会失效,导致查询出SFLIGHT全表数据,引发严重的性能问题和数据错误。
性能提示
你原有的嵌套SELECT属于"SELECT嵌套循环",每次外层循环都会发起一次数据库请求,数据量超过百级就会有明显的性能问题,合并为单次查询后可以大幅降低数据库交互次数,性能提升非常显著。
内容的提问来源于stack exchange,提问作者sumedh patil
相关产品推荐
相关产品推荐

