FOR ALL ENTRIES IN 与 INNER JOIN 内表

发布时间 2023-04-03 17:11:14作者: 斌将军

1、区别

FOR ALL ENTRIES IN 与 INNER JOIN 内表,目的都是通过内表找数据库表与之对应的数据,但是有区别。

1.1、写法

FOR ALL ENTRIES IN

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

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

 结果: