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

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,顺序也是如此。以下是包含SELECT代码的DO循环。我将DELETE放在了DO循环之外。
前两个SELECT正常工作,并属于之前存在的代码。
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.

这是调试器中内部表gt_bancbsis的图片。 调试器中的内表

1
请您能否提供一个代码示例和您所看到的实际数据?没有更多的信息,很难确定出现了什么问题。 - vwegert
我们的机器暂时出了故障,所以我现在无法提供更多信息。一旦机器恢复正常,我会发布代码。 - Eva Dias
我可以发布检索到的内部表格及其数据。 - Eva Dias
就像我说的,系统崩溃了。我现在唯一拥有的是这个和正在执行12次的选择。 - Eva Dias
这不是我比你知道得更多,而是你提供不完整或误导性信息使回答你的问题变得不必要地困难。请查看http://www.catb.org/~esr/faqs/smart-questions.html和http://www.chiark.greenend.org.uk/~sgtatham/bugs.html以了解我所说的内容。 - vwegert
显示剩余3条评论
2个回答

8
声明语句 DELETE ADJACENT DUPLICATES 中的单词ADJACENT有着很重要的意义:它表示只删除相邻的重复行。这个含义也在在线关键字文档中明确说明了:

如果相邻的行组件具有相同的内容,则认为这些行是重复的。在多个连续的重复行中,除第一个行外其余所有行均被删除。

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

 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.

谢谢。我相信它会删除所有相等的行,除了一个……我的唯一问题只是排序。谢谢。 - Eva Dias

1
BSIS 表中,您正在使用 4 个关键字段(bukrs、hkont、gjahr、belnr)。请仅使用这些字段进行排序。
  1. 首先对内部表进行排序

    SORT ITAB WITH KEY ITAB-FIELDS.
    
  2. 然后按字段进行比较

     DELETE ADJACENT DUPLICATES FROM ITAB
    

    这样就可以正常工作了。


谢谢。所以,我只需要用我的内部表的名称替换itab,对吗?那我试一下。谢谢。 - Eva Dias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接