2013-10-09 1 views
2

Я сравнивающий ВЫБОРА ДЛЯ ВСЕХ ЗАЯВОК против LOOP ВЫБРАТЬ ОДНОГО и я, имеющий большую разницу между результатами.ВЫБОР ДЛЯ ВСЕХ ЗАЯВОК против LOOP ВЫБОР ОДИН В ABAP

Sombody может помочь мне об этом? Какая разница?

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' "Pedido 
    AND ekko~loekz EQ space 
    AND ekpo~matnr IN s_matnr 
    AND ekpo~ebelp IN s_ebelp 
    AND ekpo~loekz EQ space. 

Выберите для всех записей - Возвращение 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. 

Спасибо!

+0

Вы имеете в виду разницу во времени выполнения или в фактических результатах таблицы T_ekbe? – norbip

+0

t_ekpo сортированный стол? –

ответ

7

Таблица EKBE имеет больше ключевых полей, чем только EBELN и EBELP, поэтому может быть больше записей для уникальной пары EBELN/EBELP. С помощью SELECT SINGLE вы не получите эти «лишние» записи, с помощью «ЗА ВСЕХ ЗАПИСИ». В зависимости от ваших потребностей только один из них предоставит вам правильный набор данных.

+1

Он также должен быть осторожным, потому что, если t_ekpo оказывается пустым, «ВСЕ ДЛЯ ВХОДА» не будет выбирать никакие записи, как вы могли бы ожидать, но все записи (которые соответствуют предложению WHERE). – omnibrain

1

Просто хочу добавить. Выберите сингл внутри LOOP - очень плохая идея. Если вам нужно ebeln + ebelp от ekpo, просто выберите это два в дополнительную таблицу lt_ekpo (не забудьте DISTINCT в этом выборе) и используйте ее для ВСЕХ ЗАПИСИ.