FOR ALL ENTRIES IN 与 INNER JOIN 内表
1、区别
FOR ALL ENTRIES IN 与 INNER JOIN 内表,目的都是通过内表找数据库表与之对应的数据,但是有区别。
1.1、写法
FOR ALL ENTRIES IN
"--------------------@斌将军-------------------- IF gt_acd IS NOT INITIAL. SELECT acdoca~rldnr,"总账会计中的分类账 acdoca~rbukrs,"公司代码 acdoca~gjahr,"会计年度 acdoca~belnr,"会计凭证号码 acdoca~docln"分类账 6 字符过账项目 FROM acdoca FOR ALL ENTRIES IN @gt_acd WHERE acdoca~gjahr = @gt_acd-gjahr AND acdoca~docln = @gt_acd-docln INTO TABLE @DATA(lt_data2). ENDIF. "--------------------@斌将军--------------------
INNER JOIN 内表
"--------------------@斌将军-------------------- SELECT acdoca~rldnr,"总账会计中的分类账 acdoca~rbukrs,"公司代码 acdoca~gjahr,"会计年度 acdoca~belnr,"会计凭证号码 acdoca~docln"分类账 6 字符过账项目 FROM acdoca INNER JOIN @gt_acd AS acd ON acdoca~gjahr = acd~gjahr AND acdoca~docln = acd~docln INTO TABLE @DATA(lt_data)."赋值放在最后一行 "--------------------@斌将军--------------------
1.2、用法
FOR ALL ENTRIES IN:不能使用聚合函数;关联字段的类型和长度必须一致;内表为空,则全表查询;
INNER JOIN:可以使用聚合函数;关联的字段类型长度可以不一致;内表为空,查询无果;
1.3、去重
现有数据如下:
查询内表:
内表为两条相同的物料号,作为查询条件
"--------------------@斌将军-------------------- ls_marc-matnr = '000000000000001000'. APPEND ls_marc TO lt_marc. ls_marc-matnr = '000000000000001000'. APPEND ls_marc TO lt_marc. "--------------------@斌将军--------------------
FOR ALL ENTRIES IN:会根据查询的字段,将最终结果去重
INNER JOIN 内表:相同的查询条件,会将数据全部查出
所以使用INNER JOIN 内表需要做去重,可以通过两种办法:
去重方法一:DISTINCT查询去重
在去重方面,FOR ALL ENTRIES IN 等价于 INNER JOIN 内表+DISTINCT,当查询的字段不是所有关键字时,会出现数据丢失的情况
去重方法二:查询条件去重再查询
去掉重复的查询条件,然后再查询数据库表
"--------------------@斌将军-------------------- SORT lt_marc BY matnr. DELETE ADJACENT DUPLICATES FROM lt_marc COMPARING matnr. "--------------------@斌将军--------------------
结果不重复
且查询的字段不是所有关键字时,数据仍然不会丢失
1.4、效率
用4万行数据的内表,作为查询条件,测试新老语法,并使用唯一键的排序表与新语法相结合
"--------------------@斌将军-------------------- TYPES:BEGIN OF ty_acd, gjahr TYPE acdoca-gjahr, docln TYPE acdoca-docln, rbukrs TYPE acdoca-rbukrs, END OF ty_acd. DATA:lt_acd_sort TYPE SORTED TABLE OF ty_acd WITH UNIQUE KEY gjahr docln. ... GET TIME STAMP FIELD lv_current1. MOVE-CORRESPONDING gt_acd TO lt_acd_sort. SELECT acdoca~rldnr,"总账会计中的分类账 acdoca~rbukrs,"公司代码 acdoca~gjahr,"会计年度 acdoca~belnr,"会计凭证号码 acdoca~docln"分类账 6 字符过账项目 FROM acdoca INNER JOIN @lt_acd_sort AS acd ON acdoca~gjahr = acd~gjahr AND acdoca~docln = acd~docln INTO TABLE @DATA(lt_data4). GET TIME STAMP FIELD lv_current2. "--------------------@斌将军--------------------
结果:
定期更文,欢迎关注