【转载】在ABAP中用for all entries in代替inner join

在ABAP中用for all entries in代替inner join

 

取数据一般都会用到多个表,inner join是非常常用的操作,但因为比较耗数据库资源,所以很多时间不推荐。

大家也知道,SAP这东西,应用服务器可以扩展为多个,但数据库服务器只有一个,所以必须少消耗DB资源。

据boss说,一般多对多或关联很多表(例如3个以上)时就不用inner join(前者是因为难搞清关系,不太清晰),应改成for all entries in。

header-item或多对一关系就可以inner join(即另一张表的where语句上所有的key都唯一确定了)。

下面给个例子(老师写的代码,稍微改动了一下):

 

report  ztest_jion.

 

initialization.

 

  tables : vbak.

 

  types : begin of ty_vbak,

    vbeln type vbeln_va,

    erdat type erdat,

    kunnr type kunag,

  end of ty_vbak.

 

  types : begin of ty_vbap,

    vbeln type vbeln_va,

    posnr type posnr,

    matnr type matnr,

  end of ty_vbap.

 

  types : begin of ty_fin,

    vbeln type vbeln_va,

    erdat type erdat,

    kunnr type kunag,

    posnr type posnr,

    matnr type matnr,

  end of ty_fin.

 

  data : t_vbak type standard table of ty_vbak,

  t_vbap type standard table of ty_vbap,

  t_fin_all type standard table of ty_fin,

  t_fin_join type standard table of ty_fin,

  w_vbak type ty_vbak ,

  w_vbap type ty_vbap ,

  w_fin type ty_fin.

 

  select-options : s_vbeln for vbak-vbeln.

 

start-of-selection.

  select

  vbak~vbeln

  vbak~erdat

  vbak~kunnr

  vbap~posnr

  vbap~matnr

  into table t_fin_join

  from vbak inner join vbap

  on vbak~vbeln = vbap~vbeln

  where vbak~vbeln in s_vbeln.

  if sy-subrc <> 0.

    write : 'No data.'.

    exit.

  endif.

 

  select

  vbeln

  erdat

  kunnr

  from vbak

  into table t_vbak

  where vbeln in s_vbeln.

  if t_vbak[] is not initial.

    select

    vbeln

    posnr

    matnr

    from vbap

    into table t_vbap

    for all entries in t_vbak

    where vbeln = t_vbak-vbeln.

  endif.

 

end-of-selection.

 

  write : /  'Inner jion:',

          /  'Sales Document',

          20 'Create Date',

          40 'Sold-to party',

          60 'Sales Document Item',

          80 'Material Number'.

  sort t_fin_join.

  loop at t_fin_join into w_fin.

    write : /   w_fin-vbeln,

            20  w_fin-erdat,

            40  w_fin-kunnr,

            60  w_fin-posnr,

            80  w_fin-matnr.

  endloop.

 

  skip.

 

  loop at t_vbap into w_vbap.

    w_fin-vbeln = w_vbap-vbeln.

    w_fin-posnr = w_vbap-posnr.

    w_fin-matnr = w_vbap-matnr.

    read table t_vbak into w_vbak with key

    vbeln = w_vbap-vbeln.

    if sy-subrc = 0.

      w_fin-erdat = w_vbak-erdat.

      w_fin-kunnr = w_vbak-kunnr.

    endif.

    append w_fin to t_fin_all.

    clear w_fin.

  endloop.

 

  sort t_fin_all.

  write : /  'For all entries in:',

          /  'Sales Document',

          20 'Create Date',

          40 'Sold-to party',

          60 'Sales Document Item',

          80 'Material Number'.

  loop at t_fin_all into w_fin.

    write : /   w_fin-vbeln,

            20  w_fin-erdat,

            40  w_fin-kunnr,

            60  w_fin-posnr,

            80  w_fin-matnr.

  endloop.

 

1个inner join变成了3段代码,看上去貌似很不值得,但还是分析下代码吧。

第一个是将vbak和vbap这2个表在vbeln相等的条件下进行inner join。

第二个则先从vbak中提取数据放入t_vbak。
再从vbap中提取所有vbeln = t_vbak-vbeln的数据放入t_vbap。
最后再遍历t_vbap,并从t_vbak读取相应数据,构造一个t_fin_all。
至此,t_fin_join和t_fin_all的数据就相同了(只是顺序不同,排序下就一样了)。


http://www.cnblogs.com/VerySky/articles/2277130.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值