[英]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 的圖片。
語句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 )。 僅將這些字段用於排序。
先對內表排序。
SORT ITAB WITH KEY ITAB-FIELDS.
然后比較字段。
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的圖片。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.