我有一个内部表,其中包含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
循环,其中SELECT enter code here
。我已将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.
这是dubugger中内部表gt_bancbsis的图片。
答案 0 :(得分:8)
声明ADJACENT
中的单词DELETE ADJACENT DUPLICATES
有一个很好的理由:它说明只删除了彼此相邻的重复行。这也在online keyword documentation:
如果相邻行的内容在所检查的组件中相同,则认为行是重复的。如果多个重复行彼此跟随,则删除所有行(第一行除外)。
这意味着:如果您的表包含值
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.
答案 1 :(得分:1)
在 BSIS 表中,您使用的是4个jey字段( bukrs,hkont,gjahr,belnr )。仅将这些字段用于排序。
排序内部表格。
SORT ITAB WITH KEY ITAB-FIELDS.
然后比较字段。
DELETE ADJACENT DUPLICATES FROM ITAB
它会正常工作。
答案 2 :(得分:0)
如果这是确切的代码片段,则无需通过ABAP处理重复的行。您可以通过<where_clause>
SQL语句消除它们:获取lv_last_day
的最大值并在条件中使用它(使用distinct
关键字,如果您的选择列表不包含所有内容关键领域)。要处理多个p_bukrs
,请将p_bukrs
的每个值和相应的lv_last_day
的最大值放入内部表中,然后使用FOR ALL ENTRIES IN itab
添加,将文件ID与{{}}组件进行比较1}}。这将返回没有冗余信息的数据,并且比应用程序服务器对大型结果集进行排序的开销更少。
根据&#34; bug&#34; - 之前有一个很好的评论。
此致 安德鲁。