FORALLENTRIESIN 与 INNERJOIN 内表

作者:斌将军 约 4 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, 开发
FORALLENTRIESIN 与 INNERJOIN 内表 - 封面图
FORALLENTRIESIN 与 INNERJOIN 内表 - 封面图

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、去重

现有数据如下:

FORALLENTRIESIN 与 INNERJOIN 内表 - 封面图
FORALLENTRIESIN 与 INNERJOIN 内表 - 封面图

查询内表:

内表为两条相同的物料号,作为查询条件

"--------------------@斌将军--------------------ls_marc-matnr = '000000000000001000'.APPEND ls_marc TO lt_marc.ls_marc-matnr = '000000000000001000'.APPEND ls_marc TO lt_marc."--------------------@斌将军--------------------

FOR ALL ENTRIES IN:会根据查询的字段,将最终结果去重

FORALLENTRIESIN 与 INNERJOIN 内表 - 封面图
FORALLENTRIESIN 与 INNERJOIN 内表 - 封面图

INNER JOIN 内表:相同的查询条件,会将数据全部查出

FORALLENTRIESIN 与 INNERJOIN 内表 - 封面图
FORALLENTRIESIN 与 INNERJOIN 内表 - 封面图

所以使用INNER JOIN 内表需要做去重,可以通过两种办法:

**去重方法一:** DISTINCT查询去重

在去重方面,FOR ALL ENTRIES IN 等价于 INNER JOIN 内表+DISTINCT,当查询的字段不是所有关键字时,会出现数据丢失的情况

FORALLENTRIESIN 与 INNERJOIN 内表 - 封面图
FORALLENTRIESIN 与 INNERJOIN 内表 - 封面图

**去重方法二:** 查询条件去重再查询

去掉重复的查询条件,然后再查询数据库表

"--------------------@斌将军--------------------SORT lt_marc BY matnr.DELETE ADJACENT DUPLICATES FROM lt_marc COMPARING matnr."--------------------@斌将军--------------------

结果不重复

且查询的字段不是所有关键字时,数据仍然不会丢失

FORALLENTRIESIN 与 INNERJOIN 内表 - 封面图
FORALLENTRIESIN 与 INNERJOIN 内表 - 封面图

## 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."--------------------@斌将军--------------------

结果:

FORALLENTRIESIN 与 INNERJOIN 内表 - 封面图
FORALLENTRIESIN 与 INNERJOIN 内表 - 封面图
斌将军

关于作者:斌将军

企业信息化与 SAP 技术顾问,长期专注 SAP ABAP、FI/CO、MM、SD 等模块的技术分享与实战经验总结。查看更多介绍

来源说明:本文内容由「FORALLENTRIESIN与INNERJOIN内表.md」整理生成,仅用于内部技术分享与学习交流。