ABAP中的SELECT FOR ALL ENTRIES和LOOP SELECT SINGLE有什么区别?

3
我正在比较SELECT FOR ALL ENTRIESLOOP SELECT SINGLE两者之间的区别,结果有很大的差异。请问有人可以帮我吗?这两种方式有何不同?
SELECT ekko~ebeln
    ekpo~ebelp
    ekko~bstyp
    ekko~bsart
    ekko~lifnr
    ekko~ekgrp
    ekko~aedat
    ekko~knumv
    ekko~zterm
    ekko~zbd1t
    ekpo~matnr
    ekpo~txz01
    ekpo~menge
    ekpo~meins
    ekpo~netpr
    ekpo~peinh
    ekpo~knttp
    ekpo~afnam
    ekpo~wepos
INTO TABLE t_ekpo
FROM ekko
INNER JOIN ekpo ON
    ekpo~ebeln EQ ekko~ebeln
WHERE ekko~lifnr IN s_lifnr
    AND ekko~ekgrp IN s_ekgrp
    AND ekko~ebeln IN s_ebeln
    AND ekko~aedat IN s_aedat
    AND ekko~bsart IN s_bsart
    AND ekko~bstyp EQ 'F'
    AND ekko~loekz EQ space
    AND ekpo~matnr IN s_matnr
    AND ekpo~ebelp IN s_ebelp
    AND ekpo~loekz EQ space.

SELECT FOR ALL ENTRIES 返回 9,528 条记录

SELECT ebeln
    ebelp
    zekkn
    vgabe
    gjahr
    belnr
    buzei
    budat
    menge
    shkzg
FROM ekbe
INTO TABLE t_ekbe
FOR ALL ENTRIES IN t_ekpo
WHERE ebeln EQ t_ekpo-ebeln
    AND ebelp EQ t_ekpo-ebelp
    AND vgabe IN ('1','2').

LOOP SELECT SINGLE 返回7,336条记录

LOOP AT t_ekpo INTO gs_ekpo.

    CLEAR gs_ekbe.

    SELECT SINGLE  ebeln
                 ebelp
                 zekkn
                 vgabe
                 gjahr
                 belnr
                 buzei
                 budat
                 menge
                 shkzg
    FROM ekbe
    INTO gs_ekbe
    WHERE ebeln EQ gs_ekpo-ebeln
        AND ebelp EQ gs_ekpo-ebelp
        AND vgabe IN ('1','2').

    APPEND gs_ekbe TO T_ekbe.

ENDLOOP.

你是指运行时间的差异,还是T_ekbe表中实际结果的差异? - norbip
t_ekpo是一个已排序的表吗? - Raven Dreamer
2个回答

9

表格EKBE有比EBELNEBELP更多的关键字段,因此唯一的EBELN/EBELP对可以有更多的条目。使用SELECT SINGLE时,您将无法获得这些额外的条目,而使用FOR ALL ENTRIES则可以。根据您的需要,只有其中一个会为您获取正确的数据集。


2
他还需要小心,因为如果t_ekpo恰好为空,“FOR ALL ENTRIES”不会像你期望的那样选择零记录,而会选择所有符合WHERE子句的记录。 - oldwired

2

只是想补充一点。 LOOP内部的SELECT SINGLE是一个非常糟糕的想法。 如果您需要从ekpo中获取ebeln+ebelp,只需将这两个内容选择到附加表lt_ekpo中(在此选择中不要忘记使用DISTINCT),并将其用于FOR ALL ENTRIES


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接