簡體   English   中英

DELETE ADJACENT DUPLICATES 不刪除重復項

[英]DELETE ADJACENT DUPLICATES does not delete duplicates

我有一個包含 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.

這是調試器中的內部表 gt_bancbsis 的圖片。調試器中的 itab

語句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.

BSIS表中,您使用了 4 個 jey 字段( bukrs、hkont、gjahr、belnr )。 僅將這些字段用於排序。

  1. 先對內表排序

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

     DELETE ADJACENT DUPLICATES FROM ITAB

    它會工作正常。

我有一個內部表,其中包含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的圖片。調試器中的itab

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM