Abap 检查itab2中是否存在itab1行?

Abap 检查itab2中是否存在itab1行?,abap,internal-tables,Abap,Internal Tables,我有两个内部表格,类型为OFtype字符串标准表格 第一个表包含数据 | K1 | K2 | K3 | | K1 | K2 | 第二个表包含数据 | K1 | K2 | K3 | | K1 | K2 | 在ABAP中,检查第二个表项是否完全存在于第一个表中的最快方法是什么?也许是内联函数 DATA lt_current_values TYPE stringtab. DATA lt_previous_values TYPE stringtab. APPEND 'K1' TO lt_p

我有两个内部表格,类型为OF
type字符串标准表格

第一个表包含数据

| K1 |  K2 | K3 |
| K1 | K2 |
第二个表包含数据

| K1 |  K2 | K3 |
| K1 | K2 |
在ABAP中,检查第二个表项是否完全存在于第一个表中的最快方法是什么?也许是内联函数

DATA lt_current_values TYPE stringtab.
DATA lt_previous_values TYPE stringtab.

APPEND 'K1' TO lt_previous_values.
APPEND 'K2' TO lt_previous_values.
APPEND 'K3' TO lt_previous_values.

APPEND 'K1' TO lt_current_values.
APPEND 'K2' TO lt_current_values.

DATA lv_count TYPE i.
LOOP AT lt_current_values INTO DATA(ls_cur).
  READ TABLE lt_previous_values TRANSPORTING NO FIELDS WITH KEY table_line = ls_cur.
  IF sy-subrc = 0.
    lv_count += 1.
  ENDIF.
ENDLOOP.

IF lv_count = LINES( lt_current_values ).
  " present => current_table values are already present in previous_table
ENDIF.

解决方案是临时使用带有
过滤器的哈希表

DATA lt_current_values TYPE stringtab.
FIELD-SYMBOLS <ls_current_values> LIKE LINE OF lt_current_values.
DATA lt_previous_values TYPE stringtab.
FIELD-SYMBOLS <ls_previous_values> LIKE LINE OF lt_previous_values.
DATA lth_current_values LIKE HASHED TABLE OF <ls_current_values> WITH UNIQUE KEY table_line.
DATA lth_previous_values LIKE HASHED TABLE OF <ls_previous_values> WITH UNIQUE KEY table_line.

lt_previous_values = VALUE #( ( `K1` ) ( `K2` ) ( `K3` ) ).
lt_current_values = VALUE #( ( `K1` ) ( `K2` ) ).

lth_current_values = lt_current_values.
lth_previous_values = lt_previous_values.

DATA(lt_difference) = FILTER #( lth_current_values EXCEPT IN lth_previous_values WHERE table_line = table_line ).

IF lines( lt_difference ) = 0.
  BREAK-POINT.
  " present => current_table values are already present in previous_table
ENDIF.
数据lt\u当前值类型stringtab。
字段符号,如lt_当前值的行。
数据lt_上一个值类型stringtab。
字段符号,如lt_先前_值的行。
数据lth_当前_值,如具有唯一键表行的哈希表。
数据lth_以前的值,如具有唯一键表行的哈希表。
lt_previous_values=VALUE#(`K1`)(`K2`)(`K3`))。
lt_current_values=VALUE#(`K1`)(`K2`))。
lth\u当前值=lt\u当前值。
lth_先前_值=lt_先前_值。
数据(lt_差异)=过滤器#(lth_当前值,lth_先前值除外,其中table_行=table_行)。
如果行(lt_差)=0。
突破点。
“present=>当前的\u表值已存在于上一个\u表中
恩迪夫。

我建议您对代码进行两项更改:

DATA lt_current_values TYPE stringtab.
DATA lt_previous_values TYPE stringtab.

APPEND 'K1' TO lt_previous_values.
APPEND 'K2' TO lt_previous_values.
APPEND 'K3' TO lt_previous_values.

APPEND 'K1' TO lt_current_values.
APPEND 'K2' TO lt_current_values.
SORT lt_previous_values. " Sort the table to use binary search

DATA lv_count TYPE i.
LOOP AT lt_current_values INTO DATA(ls_cur).
  READ TABLE lt_previous_values TRANSPORTING NO FIELDS WITH KEY table_line = ls_cur BINARY SEARCH. " use Binary Search
  IF sy-subrc NE 0. " Check if it DOESN'T exist
    DATA(lv_not_contains_all) = abap_true. " Use a flag to check later
    EXIT. " Don't need to continue checking, this can save a lot of time
  ENDIF.
ENDLOOP.

IF lv_not_contains_all IS INITIAL.
  " present => current_table values are already present in previous_table
ENDIF.

这回答了你的问题吗?嗨@Jagger谢谢你的回答。但在我的例子中,我使用的是标准表。FILTER关键字只适用于排序表或散列表。你总是可以使用带有非唯一键的排序表或散列表来代替标准表。这将是你要求的最简单、最快的方法。@Jagger,我依赖于稍后映射的表。请原谅我对该主题的无知,但您是否认为如果我对两个表进行排序,会不会对两个表中的顺序进行类似的更改?我的意思是,我是否仍然可以继续使用索引进行映射?您可以保留表,并将它们临时分配给具有相同结构但具有排序或排序的表散列键。然后您可以进行检查,然后返回到标准表。如果您将一些代码作为完全工作的最小示例发布,那么我可以为您准备一个示例作为此问题的答案。我比较了两个变体,这一个似乎是最快的,特别是对于大量数据。例如e、 26秒,用标准表从1000000个随机字符串中找出1000个(dever的解决方案),5秒使用排序唯一,1秒使用此哈希变量。当然,这不是一个可靠的基准,只是一些角号。如果您想确定,请使用您自己的数字对您自己的样本数据进行验证。有一些小事情可以更改:将字符串放入哈希表中,使用“=“只有在没有重复项的情况下才有效。循环和插入也适用于重复字符串。当
DATA(contains_all)=xsdbool(lt_差为初始值)
时,可以获得稍微短一点的最终结果。