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,他们也按照这个顺序。这是DOSELECT 所在的循环enter code here。我已经把循环的DELETE外部。DO

两个 firstSELECT工作正常,属于以前存在的代码。

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 的图片。 调试器中的 itab

4

2 回答 2

8

ADJACENT声明中的词DELETE ADJACENT DUPLICATES有一个很好的理由:它指出只删除彼此相邻的重复行。在线关键字文档中也说明了这一点:

如果相邻行的内容在检查的组件中相同,则认为行是重复的。在多个重复行相继出现的情况下,所有行(第一行除外)都将被删除。

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

 A B
 C D
 A B
 C D

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

SELECT另一方面,该语句不保证返回所选数据集时的特定顺序,除非您将其告知ORDER BY一个或多个列。这些行只是按任意顺序返回,如果DELETE ADJACENT DUPLICATES语句有效,那纯属巧合。它甚至可能在一个系统上工作,在另一个系统上停止工作,并且在第三个系统上只删除一半的重复项。所以,基本规则:

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

为了获得更好的可伸缩性,您应该使用该SORT语句而不是让数据库使用ORDER BY. 所以你可以使用

SORT gt_bancbsis.
DELETE ADJACENT DUPLICATES FROM gt_bancbsis.

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

SORT gt_bancbsis BY foo bar baz.
DELETE ADJACENT DUPLICATES FROM gt_bancbsis COMPARING foo bar baz.
于 2012-11-07T11:27:25.800 回答
1

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

  1. 首先对内部表进行排序。

    SORT ITAB WITH KEY ITAB-FIELDS.
    
  2. 然后比较字段。

     DELETE ADJACENT DUPLICATES FROM ITAB
    

    它会正常工作。

于 2012-11-07T04:29:26.503 回答