内部テーブルの列または複数の列から一意の値を抽出する最も効率的な方法は何ですか?
3 に答える
ABAP 7.40 の SP08 リリースより前では、内部テーブルまたは itab から一意の値を抽出する最も効率的な方法は次のとおりです。
LOOP AT lt_itab ASSIGNING <ls_itab>.
APPEND <ls_itab>-value TO lt_values.
ENDLOOP.
SORT lt_values.
DELETE ADJACENT DUPLICATES FROM lt_values.
内部テーブルに追加する前に与えられたの存在をチェックすることは、一意性を保証する別の方法ですが、標準テーブルに挿入する場合、<ls_itab>-value
おそらく計算コストがはるかに高くなります。ソート済みまたはハッシュ済みの宛先テーブルの場合は、次を使用します。
LOOP AT lt_itab ASSIGNING <ls_itab>.
READ TABLE lt_sorted_values WITH KEY table_line = <ls_itab>-value BINARY SEARCH.
IF sy-subrc <> 0.
APPEND <ls_itab>-value TO lt_sorted_values.
ENDIF.
ENDLOOP.
最初の方法を使用してダミー テーブルに値を挿入し、その後に を挿入する方が高速であるAPPEND LINES OF lt_dummy INTO lt_sorted_values
可能性がありますが、中間テーブルのサイズがそれを混乱させる可能性があることに注意してください。
ただし、ABAP 7.40 サポート パッケージ 08以降では、GROUP BY
ループは一意の値を抽出するためのより優れた方法を提供します。名前が示すように、これらの機能は SQL のGROUP BY
. たとえば、次のコードは、内部テーブルから一意のプロジェクト番号を抽出します。
LOOP AT lt_project_data ASSIGNING FIELD-SYMBOL(<ls_grp_proj>)
GROUP BY ( project = <ls_grp_proj>-proj_number ) ASCENDING
WITHOUT MEMBERS
ASSIGNING FIELD-SYMBOL(<ls_grp_unique_proj>).
APPEND <ls_grp_unique_proj>-project TO lt_unique_projects.
ENDLOOP.
EKPO
テーブルの複合主キーEBELN
("Purchasing Document", po_nr
) およびEBELP
("Item Number of Purchasing Document", po_item
)などの一意のペアを取得するために、同じロジックを拡張できます。
LOOP AT lt_purchasing_document_items ASSIGNING FIELD-SYMBOL(<ls_grp_po>)
GROUP BY ( number = <ls_grp_po>-po_nr
item = <ls_grp_po>-po_item ) ASCENDING
WITHOUT MEMBERS
ASSIGNING FIELD-SYMBOL(<ls_grp_po_item>).
APPEND VALUE #( ebeln = <ls_grp_po_item>-number
ebelp = <ls_grp_po_item>-item ) TO lt_unique_po_items.
ENDLOOP.
新しい ABAP 7.40 リリースの SAP 設計者の 1 人である Horst Keller 氏によると、GROUP BY ループのパフォーマンスは、これらの LOOP を手動で実装した場合と同じになる可能性があります。そのようなカスタム ループがどのように (非) 効率的に実装されるかによっては、さらに高速になる可能性があります。これらは、GROUP BY
ループが利用できないシステムの場合、上記の 2 つの方法よりも高速であることに注意してください。
ほとんどの場合、値を返すためにデータベースにクエリを実行すると、DISTINCT
特にHANA システムで、内部テーブルを使用する ABAP コードが水から吹き飛ばされてしまうため、はるかに高速でパフォーマンスが向上することに注意してください。
これはどう?
lt_unique[] = lt_itab[].
SORT lt_unique[] BY field1 field2 field3...
DELETE ADJACENT DUPLICATES FROM lt_values COMPARING field1 field2 field3...