如何不使用双重循环替换内表A中与内表B匹配的行
不用双重循环替换内表A中匹配B的行
要高效实现这个需求,核心是给内表B建立基于关键字段的哈希表,利用哈希表O(1)的查找效率,把整体时间复杂度从嵌套循环的O(n*m)降到O(n)。具体步骤如下:
步骤1:为B创建哈希表
先基于tab1的关键字段(bukrs/belnr/gjahr/buzei)定义哈希表类型,再将内表B的数据复制到哈希表中:
TYPES: BEGIN OF tab1, bukrs TYPE bukrs, belnr TYPE belnr, gjahr TYPE gjahr, buzei TYPE buzei, " 关键字段结束 blart TYPE blart, bldat TYPE bldat, bschl TYPE bschl, menge TYPE menge, meins TYPE meins, dmbtr TYPE dmbtr, waers TYPE waers, zstatus TYPE c LENGTH 1, END OF tab1. * 定义哈希表类型,关键字段为tab1的四个主键 TYPES: tt_tab1_hash TYPE HASHED TABLE OF tab1 WITH UNIQUE KEY bukrs belnr gjahr buzei. DATA(lt_b_hash) = VALUE tt_tab1_hash( FOR wa IN lt_b ( wa ) ).
步骤2:遍历A并替换匹配行
遍历内表A的每一行,通过关键字段在哈希表中快速查找B的对应行,找到后直接替换A的当前行:
LOOP AT lt_a ASSIGNING FIELD-SYMBOL(<fs_a>). READ TABLE lt_b_hash ASSIGNING FIELD-SYMBOL(<fs_b>) WITH TABLE KEY bukrs = <fs_a>-bukrs belnr = <fs_a>-belnr gjahr = <fs_a>-gjahr buzei = <fs_a>-buzei. IF sy-subrc = 0. " 替换整行(关键字段值相同,直接覆盖不影响) <fs_a> = <fs_b>. " 也可以只替换非关键字段,比如: " <fs_a>-blart = <fs_b>-blart. " <fs_a>-bldat = <fs_b>-bldat. " ... 其他非关键字段依次赋值 ENDIF. ENDLOOP.
备选方案:排序表+二分查找
如果无法使用哈希表(比如版本限制),可以将B排序后用二分查找,时间复杂度为O(n log m):
* 先给B排序 SORT lt_b BY bukrs belnr gjahr buzei. LOOP AT lt_a ASSIGNING <fs_a>. READ TABLE lt_b ASSIGNING <fs_b> WITH KEY bukrs = <fs_a>-bukrs belnr = <fs_a>-belnr gjahr = <fs_a>-gjahr buzei = <fs_a>-buzei BINARY SEARCH. IF sy-subrc = 0. <fs_a> = <fs_b>. ENDIF. ENDLOOP.
两种方法都避免了双重循环,哈希表的查找效率更高,适合数据量较大的场景。
内容的提问来源于stack exchange,提问作者ic_xc_nika
相关产品推荐
相关产品推荐

