ABAP delete duplicate的用法指南

本文介绍了ABAP中内表的基本操作,包括如何删除特定条件下的数据行、删除相邻重复项及保留首条记录的方法。此外,还通过两个具体实例展示了如何定义非唯一键以及如何利用DELETE ADJACENT DUPLICATE ENTRIES命令来处理重复数据。

DELETE TABLE <itab> FROM <wa>.
or
DELETE TABLE <itab> WITH TABLE KEY <k1> = <f 1> ... <k n> = <f n>.
根据条件删除内表中的一行数据

DELETE <itab> WHERE <cond>.
根据条件删除内表中的多行数据

DELETE ADJACENT DUPLICATE ENTRIES FROM <itab> 
                                  [COMPARING <f1> <f 2> ... 
                                             |ALL FIELDS].
删除相邻行的重复项,保留第一条记录
1、如果没有定义non-nuique键,并且在删除的时候没有指定条件,则将比较所有的字段;等同于比较
DELETE ADJACENT DUPLICATES FROM ITAB COMPARING ALL FIELDS
定义non-unique字段方式如下:
DATA ITAB LIKE STANDARD TABLE OF LINE
          WITH NON-UNIQUE KEY COL2.
2、如果有non-unique键,则在没有删除的比较条件时比较该key,删除相邻的重复项。
3、可以使用指定条件进行比较处理 COMPARING <f1> <f 2> ... ,此时,需要所有指定字段在相邻处相同,否则不会删除。
当然在此也可以使用动态的方式指定比较的内容,下面的例子二我做了一个简单的测试,仅供参考。

其他补充说明:
如果对比较的字段进行了事先的排序,则可以将所有该字段重复的行全部删除。
如果至少删除成功一条,则sy-subrc返回0,否则返回4.

下面将是两个例子:
例子一:
DATA: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF LINE.

DATA ITAB LIKE HASHED TABLE OF LINE WITH UNIQUE KEY COL1.

DO 4 TIMES.
LINE-COL1 = SY-INDEX.
LINE-COL2 = SY-INDEX ** 2.
INSERT LINE INTO TABLE ITAB.
ENDDO.

LINE-COL1 = 1.

DELETE TABLE ITAB: FROM LINE,
                   WITH TABLE KEY COL1 = 3.

LOOP AT ITAB INTO LINE.
WRITE: / LINE-COL1, LINE-COL2.
ENDLOOP.

例子二:
DATA OFF TYPE I.

DATA: BEGIN OF LINE,
      COL1 TYPE I,
      COL2 TYPE C,
      col3 type c,
END OF LINE.

DATA ITAB LIKE STANDARD TABLE OF LINE
          WITH NON-UNIQUE KEY COL2.
LINE-COL1 = 1. LINE-COL2 = 'A'. line-col3 = '9'. APPEND LINE TO ITAB.
LINE-COL1 = 1. LINE-COL2 = 'A'. line-col3 = '9'. APPEND LINE TO ITAB.
LINE-COL1 = 1. LINE-COL2 = 'B'. line-col3 = '9'. APPEND LINE TO ITAB.
LINE-COL1 = 2. LINE-COL2 = 'B'. line-col3 = '9'. APPEND LINE TO ITAB.
LINE-COL1 = 3. LINE-COL2 = 'B'. line-col3 = '8'. APPEND LINE TO ITAB.
LINE-COL1 = 4. LINE-COL2 = 'B'. line-col3 = '9'. APPEND LINE TO ITAB.
LINE-COL1 = 5. LINE-COL2 = 'A'. line-col3 = '9'. APPEND LINE TO ITAB.

OFF = 0.
PERFORM LIST.

DELETE ADJACENT DUPLICATES FROM ITAB COMPARING ALL FIELDS.
OFF = 30.
PERFORM LIST.

DELETE ADJACENT DUPLICATES FROM ITAB COMPARING col1 col3.
OFF = 60.
PERFORM LIST.
DELETE ADJACENT DUPLICATES FROM ITAB.

*data:col(4) type c.
*FIELD-SYMBOLS: <fs-lydn> type ANY.
*col = 'col1'.
*ASSIGN col to <fs-lydn>.
*DELETE ADJACENT DUPLICATES FROM ITAB COMPARING (<fs-lydn>) col3.
*OFF = 60.
*PERFORM LIST.
*DELETE ADJACENT DUPLICATES FROM ITAB.

OFF = 90.
PERFORM LIST.
FORM LIST.
SKIP TO LINE 3.
LOOP AT ITAB INTO LINE.
     WRITE:   AT /OFF LINE-COL1, LINE-COL2,line-col3.
ENDLOOP.
ENDFORM.

### ABAP Delete 语句的使用方法 #### 删除单行数据 通过 `INDEX` 参数可以从内部表中删除特定索引位置的一行或多行。此操作会调整后续行的索引值,使其依次递减。 ```abap DATA itab TYPE TABLE OF string. APPEND 'Row1' TO itab. APPEND 'Row2' TO itab. APPEND 'Row3' TO itab. DELETE itab INDEX 2. " 删除第二行 ``` 当成功执行时,系统变量 `SY-SUBRC` 将被设置为 0;如果尝试删除不存在的索引,则 `SY-SUBRC` 返回 4[^2]。 --- #### 删除相邻重复项 为了移除内部表中的连续重复条目,可以使用以下语法: ```abap DELETE ADJACENT DUPLICATES FROM <itab> [COMPARING <field_list>|ALL FIELDS]. ``` - **默认行为**:如果没有显式指定 `COMPARING` 子句,默认情况下将比较所有字段并保留第一次出现的记录。 - **自定义字段列表**:可以通过 `COMPARING` 指定要对比的具体字段集合。 示例代码如下: ```abap DATA itab TYPE TABLE OF sflight WITH EMPTY KEY. SELECT * INTO TABLE @itab FROM sflight UP TO 10 ROWS. SORT itab BY carrid connid fldate. DELETE ADJACENT DUPLICATES FROM itab COMPARING carrid connid fldate. ``` 在此例子中,先对表格按某些字段排序,再基于这些字段删除相邻重复的数据[^1]。 --- #### 基于条件删除多行 可通过 `WHERE` 子句实现更灵活的选择性删除。支持复杂的布尔表达式以及范围匹配(Range Matching)。以下是几个典型场景及其对应的代码片段: ##### 场景一:简单条件过滤 删除符合某一固定条件的所有行。 ```abap DATA gt_xxx TYPE TABLE OF ztable. " Populate table... DELETE gt_xxx WHERE field = 'X'. ``` 此处只会影响那些满足 `FIELD='X'` 的记录[^3]。 ##### 场景二:利用 Range 表筛选目标集 借助预先准备好的区间型辅助结构来限定待清除的目标子集。 ```abap DATA: BEGIN OF s_matnr OCCURS 0, sign(1), option(2), low LIKE mara-matnr, high LIKE mara-matnr, END OF s_matnr. s_matnr-sign = 'I'. " Include mode s_matnr-option = 'BT'. " Between operator s_matnr-low = 'MAT1000'. s_matnr-high = 'MAT9999'. IF lines( s_matnr ) > 0. DELETE gt_item WHERE matnr IN s_matnr. ENDIF. ``` 注意,在实际调用之前需验证输入参数的有效性以避免潜在错误发生[^4]。 --- #### 特殊注意事项 - 执行任何大规模修改操作前建议备份原始数据副本以防万一; - 对涉及业务逻辑的关键更新动作应充分测试其影响边界后再上线部署。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值