You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用双重循环替换内表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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 17:10:29