ABAP SELECT


1、select * 和SELECT XX1 XX2 XX3等的區別:

如果讀取到的XX1 XX2 XX3組成的行數據存在重復,比如讀到了超過1行的A1 B2 C1,那么它在內表里只會保存1行,在讀取金額時尤其金額如果相同,那么就會少一條數據

所以如果涉及金額累加等,盡量用SELECT *

 

2、SELECT *  ……FOR ALL ENTRIES IN 

ABAP開發中,使用for all entries in語句將不能使用join的聚集表(例如BSEG)或者需要使用select的內表與內表串聯。

BSEG為例:

select belnr hkont

from bsis

into corresponding fields of table itab1

where ....

if not itab1[] is initial.

select kunnr lifnr belnr

from bseg

into corresponding fields of table itab2

for all entries in itab1

where belnr = itab1-belnr and hkont = itab1-hkont and ....

endif.

由於BESG不能和BSIS做內聯,所以先將BSIS要獲取的內容放到內表itab1中,然后用 for all entries in 來串聯。

注意:

1、必須要判斷for all entries in后面的內表是否為空,如果為空,where條件中與內表中字段進行比較的結果全部為真,會導致取出非常多的數據,影響系統性能。

2、使用for all entries in,對於最后得出的結果集系統會自動刪除重復行(即使用了distinct)。如果要保留重復行記錄,要在SELECT語句中添加足夠的key(有必要時,增加全部key),以保證結果集中所需重復項目不會被刪除。

3、對於內表中作為條件替換用項目,不能使用LIKE,BETWEEN,IN比較操作符。這些比較操作符都是不確定比較操作符(將選擇條件設定在一個范圍內),而 for all entries in 語句的作用相當於將選擇條件塊全部並列開來,用OR連接,如果每個OR分支中又是不確定的范圍,那么系統性能將大大降低。

4、使用該語句時,ORDER BY語句和HAVING語句將不能使用。

5、使用該語句時,除COUNT( * )以外的所有合計函數(MAX,MIN,AVG,SUM)都不能使用。

6、使用 for all entries in 雖然在某些方面很方便的,但很耗內存。

7、itab-field作為占位符被替換,所以定義內表itab時不要使用with header line,以免造成混淆

8、select distinct可以直接去重復


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM