首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >删除相邻重复项不会删除重复项

删除相邻重复项不会删除重复项
EN

Stack Overflow用户
提问于 2012-11-07 00:24:02
回答 2查看 45.6K关注 0票数 4

我有一个内部表,其中填充了108个条目。从9到9个条目重复这些条目,我想删除那些重复的条目。由于它们与我使用的delete adjacent duplicates from itab comparing all fields完全相同。在没有comparing all fields的情况下也尝试过。没有成功。

如果有帮助,我的表有9个字段: bukrs、hkont、gjahr、belnr、budat、waers、shkzg、wrbtr、dmbtr和dmbe2。他们来自BSIS,他们也是这个顺序的。这是DO循环,其中是SELECTenter code here。我已经将DELETE放在了DO循环之外。

前两个SELECT运行得很好,属于之前存在的代码。

代码语言:javascript
运行
复制
DO 12 TIMES.
         lv_aux = lv_aux + 1.
         lv_tamanho = STRLEN( lv_aux ).
         IF lv_tamanho = 1.
           CONCATENATE '0' lv_aux INTO lv_aux.
         ENDIF.
         CONCATENATE p_gjahr lv_aux '01' INTO z_v_first_day.

         PERFORM get_last_day_of_month USING z_v_first_day
                                       CHANGING lv_last_day.

         " some other code irrelevant to the issue

         SELECT bukrs hkont gjahr belnr budat waers shkzg dmbtr wrbtr dmbe2 FROM bsis
           APPENDING CORRESPONDING FIELDS OF TABLE gt_bancbsis
           WHERE hkont = '0051100001'
           AND bukrs EQ p_bukrs
           AND budat <= lv_last_day.

         " some other code irrelevant to the issue
ENDDO.

DELETE ADJACENT DUPLICATES FROM gt_bancbsis COMPARING ALL FIELDS.

这是dubugger中内部表gt_bancbsis的图片。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-07 19:27:26

语句DELETE ADJACENT DUPLICATES中的单词ADJACENT有一个非常好的理由:它规定只有相邻的重复行才会被删除。online keyword documentation中也说明了这一点

如果所检查的组件中相邻行的内容相同,则认为

行是重复的。在多个重复行相继出现的情况下,所有行(第一行除外)都将被删除。

这意味着:如果您的表包含以下值

代码语言:javascript
运行
复制
 A B
 C D
 A B
 C D

它包含重复的值,但由于这些值不相邻,所以无论您指定什么,DELETE ADJACENT DUPLICATES都不会删除它们。

另一方面,除非告诉SELECT语句ORDER BY一个或多个列,否则在返回选定的datasets时,它不能保证特定的顺序。这些行以任何顺序返回,如果DELETE ADJACENT DUPLICATES语句可以工作,那纯粹是巧合。它甚至可能在一个系统上工作,在另一个系统上停止工作,在第三个系统上只删除一半的重复项。所以,基本原则是:

在删除重复项之前,请确保按要检查重复项的字段对内部表进行排序。

为了获得更好的可伸缩性,您应该使用SORT语句,而不是让数据库使用ORDER BY对行进行排序。因此您可以使用以下两种方法

代码语言:javascript
运行
复制
SORT gt_bancbsis.
DELETE ADJACENT DUPLICATES FROM gt_bancbsis.

或者,如果您只想检查某些字段,

代码语言:javascript
运行
复制
SORT gt_bancbsis BY foo bar baz.
DELETE ADJACENT DUPLICATES FROM gt_bancbsis COMPARING foo bar baz.
票数 8
EN

Stack Overflow用户

发布于 2012-11-07 12:29:27

BSIS表中,您使用了4个jey字段( bukrs,hkont,gjahr,belnr )。这些字段仅用于排序。

首先对内部表执行

  1. Sort操作。

使用KEY ITAB-FIELDS.

  • Then 比较字段对ITAB进行排序。

从ITAB中删除相邻重复项

它会工作得很好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13255213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档