1、这里需要强调的是,如果要使用函数(如SUM、MAX、MIN),则需要将其他字段通过GROUP BY 进行分组。如果需要继续对使用函数进行条件筛选,则可以使用关键字HAVING。关键字ORDER BY 决定查询结果的排序方法,ASCENDING为升序,DESCENDING为降序。1 SELECT SINGLE单行数据:SELECT SINGLE .如果系统找到一个完全符合指定条件的行,SY-SUBRC返回0,否则返回4。一般不需要指明所有字段,而是在SELECT后用*符号, 若指定多个数据对象,则需要将这些对象放在括号中,并用逗号隔开,而且其顺序需要与SELECT子句中指明的表字段顺序一致。这里
2、的为结构非内表。TABLES:sflight.DATA:sumTYPEiVALUE0.SELECTSINGLESUM(seatsocc)INTOFROMsflightWHEREcarrid=LH.WRITE:/sum.以上实现的是航线为LH的合计座位数。区别以下代码,上面代码只输出一行,下面则输出多行:2 SELECT / ENDSELECT循环通过SELECT / ENDSELECT循环从数据库中读取多行。SELECT DISTINCT . ENDSELECT.注:使用DISTINCT自动去掉重复的行;SY-DBCNT(系统字段)为每次循环计数.使用distinct达到的效果与select
3、single一样,建议使用select single语句。3 一次性SELECT .INTO一次性把数据选择到一个内表中去。SELECT .INTO|APPENDINGCORRESPONDING FIELDS OFTABLE itab.该情况下SELECT并不启动循环,因而不需要使用ENDSELECT语句;如果itab非空,则SELECT语句将用读取的数据覆盖其中的内容,使用APPENDING代替INTO将不覆盖内表,若结构不完全相同,也可使用CORRESPONDING FIELDS选项将同名区域相对应。SQL编写注意事项-性能实例1直接内表操作优先尽量不要在频率较高的循环语句中使用updat
4、einsertdeletemodify等操作,即尽量不要通过工作区实现,直接通过操作内表实现。2 select into table优于selectappend table.endselect在对内表赋值时,尽量使用select into table的写法来代替selectappend table.endselect 的写法。尽量用对内表的操作来代替对数据库的操作。 BEGIN OF it_mara OCCURS 0,matnr LIKE mara-matnr,maktx LIKE makt-maktx,END OF it_mara.第一种写法:Select matnrINTO it_mara
5、FROM mara.APPEND it_mara.ENDSelect. 第二种写法(high performace):INTO TABLE it_mara3 使用for all entries不推荐Loop at int_cntry. Select single * from zfligh into int_fligh where cntry = int_cntry-cntry. Append int_fligh.Endloop.推荐Select * from zfligh appending table int_flighFor all entries in int_cntry Where
6、cntry = int_cntry-cntry.内表可以用来存放多笔数据,OPEN SQL允许以内表数据作为查询条件,以方便对查询对查询数据的进一步的筛选,相关语法如下:Select from FOR ALL ENTRIED IN WHERE 需要注意的是,在FOR ALL ENTRIED IN itab 之前,一定要检查itab表是否为空,若为空则不执行查询,否则会查询所有非条件限制的数据。示例1:CHECKLT_MKPFISNOTINITIAL.*IFP_MATNRMBLNRZEILEMJAHRBWARTWERKSMATNRMENGESHKZGMSEGCORRESPONDINGFIELDS
7、OFTABLELT_MSEGFORALLENTRIESINLT_MKPF=LT_MKPF-MBLNRandLT_MKPF-MJAHRP_WERKSANDP_MATNRP_BWART.ENDIF.示例2: BEGIN OF it_makt OCCURS 0,END OF it_makt.(需定义it_mara)Select matnr INTO TABLE it_mara FROM mara.LOOP AT it_mara.Select SINGLE maktx INTO it_mara-maktx FROM maktWhere matnr = it_mara-matnr AND spras =
8、 sy-langu.MODIFY it_mara TRANSPORTING maktx. * 只修改maktx字段ENDLOOP. 第二种写法(需定义it_mara &it_makt): high performaceSelect matnr maktx INTO TABLE it_makt FROM maktFOR ALL ENTRIES IN it_maraWhere matnr = it_mara-matnr and spras = sy-langu.4 wherein对存在OR条件等判断的语句,尽量使用IN来代替。5 where条件 Where 语句中尽量避免使用”等模糊条件来查询。
9、不要使用CHECK语句对table 进行条件查询,用where语句代替。6 Join语句连接多个表数据查询尽量使用JOIN语句,且注意应选择数据量最小的表来作为基表,尽量避免三个以上的表的相关JOIN查询。7 select single在查询单条语句时,尽量使用select single语句,不要使用selectendselect语句。8 Up to n rows使用语法up to n rows来实现对数据前n项的查询。9 Select 栏位尽量具体尽量使用select f1 f2具体栏位来代替select * 写法。10利用函数充分利用系统提供的标准函数,如max,min,avg,sum,c
10、ount.示例(使用max聚合函数):Maxnu = 0.Select * from zflight where airln = LF and cntry = IN.Check zflight-fligh maxnu.Maxnu = zflight-fligh.Endselect.Select max( fligh ) from zflight into maxnu where airln = LF and cntry = IN.11使用INTO table 代替select endselectRefresh: int_fligh.Select * from zflight into int_
11、fligh.Append int_fligh. Clear int_fligh.Select * from zflight into table int_fligh.TABLE1 RANGE TABLERange Table 为 SAP R/3系统标准内表的一种,结构与 Selection Table 一致,由 SIGN, OPTION, LOW 和 HIGH字段组成;可以通过 TYPE RANGE OF 语句或 RANGES 关键字定义 Range Table。1) TYPE RANGE OFDATA rtab TYPE RANGE OF type|LIKE RANGE OF dobj IN
12、ITIAL SIZE nWITH HEADER LINEVALUE IS INITIALREAD-ONLY.2) RANGES语法:RANGES rtab FOR dobj OCCURS n.2 两个内表间赋值 Itab1=itab2tables:zcustom,scustom.datat1_zcustomtypeSTANDARDzcustomwithHEADERLINE.t2_zcustomlikeWITHselectfromscustomintot1_zcustom.t2_zcustomt1_zcustom. APPEND lines of itab2 to itab1(append it
13、ab2 to itab1)Itab2 to itab1 还可通过LOOP 语句循环读取内表实现。loopatappendtot2_zcustom. 或appendlinesoft2_zcustom.endloop.以上LOOP循环虽可实现内表逐行添加,但建议使用批量增加代替逐行添加:Loop at int_fligh1.Append int_fligh1 to int_fligh2.Append lines of int_fligh1 to int_fligh2. begin of it_makt/it_mara OCCURS0 ,ENDOF it_makt/it_mara .matnrmak
14、txMAKTit_maktWheresprassy-langu.LINESit_mara.-MARA.DATALT_MARALIKEMARALT2_MARALT_MARA.APPENDTOLT2_MARA.与上面仅内表定义不同。3 COLLECTCollect语句可根据某些关键列来完成数值字段的汇总。COLLECT一般在loop中使用,使用collect不需要对内表排序,对内表也没有其他限制条件。语法如下:COLLECT itab1 INTO itab2 其中itab2 必须定义为哈希表,并指定1个或多个关键字段。示例如下,数值字段有两个,非数值字段也有两个且定义为KEY ,经过下面结果可以看
15、到,事实上完成了一个物料+库位的一个分类汇总:mkpf,mseg.data:beginita,mblnrmseg-mblnr,lgortmseg-lgort,mengemseg-menge,dmbtrmseg-dmbtr,enditaitbOCCURS0LINEitcHASHEDUNIQUEKEYLINE.定义统计结果内表(必须是哈希内表)MSEGitbBETWEEN49030375134903037514itb.collectitc.按关键列统计值endloopwrite:sy-uline内表数据:,itb-mblnr,itb-lgort,itb-menge,itb-dmbtr.collec
16、t后的数据:itc.,itc-mblnr,itc-lgort,itc-menge,itc-dmbtr.实现的功能是根据物料凭证号+库位来统计 移动数量及金额,从结果来看应该是正确的,因为上面凭证是311从7012和7018的移库,数量肯定相等,金额为0,下面凭证为261发货。4 内表、字符串及循环处理 LOOP循环内表时,可根据需求加上where条件. 读取内表时加上扩展语句BINARY SEARCH. 内表数据增加APPEND ITAB(带表头).或APPEND WA TO ITAB(不带表头). 内表数据更新MODIFY 更新内表时,加上transponding 可以指定更新字段。示例如下
17、:tablet1_zcustom-nameOK1t1_zcustom-cityOK2MODIFYT1_ZCUSTOMTRANSPONDINGNAME. “只更新了name字段。如去掉transponding则内表更新name和city字段。性能实例1 使用二分法查询,提高查询/读取内表数据速度Read table int_fligh with key airln = LF.推荐(使用前先按关键字排序)Read table int_fligh with key airln = LF binary search.2使用批量修改内表代替逐行修改Loop at int_fligh.If int_fligh-flag is initial.Int_fligh-flag = X.Endif.Modify int_fligh.Modify int_fligh transporting flag where flag is initial.
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1