SAP ABAP 学习总结(13):Database table Select from several table(从多个表中选择数据库表查询)

多表查询

需求:查询出头表 vbak 中 ernam 为 CHENGA,audat 为 20190401 的订单详情,订单详情表在 vbap 中,外键是字段 vbeln。

思路:
1.先查询出ernam 为 CHENGA,audat 为 20190401的所有订单头表数据
2.根据第一步查询出的数据中的主键vbeln查询出每笔订单的订单详情

  • 第一种:FOR ALL ENTRIES IN:限定一个表中的字段,从而查询另一个表
*声明一个内表gt_vbak存储数据库表vbak
DATA:gt_vbak TYPE TABLE OF vbak.
*声明一个内表gt_vbap存储数据库表vbap
DATA:gt_vbap TYPE TABLE OF vbap.
*声明一个结构体存放每条数据
DATA:gs_vbak TYPE vbak.
*声明一个结构体存放每条数据
DATA:gs_vbap TYPE vbap.

*先清空数据,避免让遗留数据影响
REFRESH gt_vbak.
*在vbak中查询出来的数据是条件:vbeln字段是两张表关联的主外键,ernam audat这两个字段是where后的查询条件
SELECT vbeln ernam audat FROM vbak
  "匹配字段查询后的数据放在内表gt_vbak中
  INTO CORRESPONDING FIELDS OF TABLE gt_vbak
  WHERE ernam = 'CHENGA'
  AND audat = '20190401'.

  "先判断限制表是否为空
  IF gt_vbak IS NOT INITIAL.
    "先清空数据,避免让遗留数据影响
    REFRESH gt_vbap.
    "vbeln字段是两表关联的主外键,posnr matnr arktx这三个字段是查询表vbap想要展示的字段
    SELECT vbeln posnr matnr arktx FROM vbap
      "匹配字段查询后的数据放在内表gt_vbap中
      INTO CORRESPONDING FIELDS OF TABLE gt_vbap
      "内表gt_vbak中存放限制条件查询后的数据(放在FOR ALL ENTRIES IN后面的表必须不为空,所以需要先判断是否为空)
      FOR ALL ENTRIES IN gt_vbak
      "当vbeln = gt_vbak-vbeln时,两表关联成功
      WHERE vbeln = gt_vbak-vbeln.
      " 遍历gs_vbap
      LOOP AT gt_vbap INTO gs_vbap.
        WRITE: / gs_vbap-vbeln, / gs_vbap-posnr, / gs_vbap-matnr, / gs_vbap-arktx.
      ENDLOOP.
  ENDIF.
  • 第二种:INNER JOIN:通过外键查询
"第二种:INNER JOIN
*声明一个内表gt_vbak存储数据库表vbak
DATA:gt_vbak TYPE TABLE OF vbak.
*声明一个内表gt_vbap存储数据库表vbap
DATA:gt_vbap TYPE TABLE OF vbap.
*声明一个结构体存放每条数据
DATA:gs_vbak TYPE vbak.
*声明一个结构体存放每条数据
DATA:gs_vbap TYPE vbap.
"第二种:INNER JOIN (所有字段前必须加 表名~)

"先清空gt_vbap
REFRESH gt_vbap.
"最终要从vbap表中查询vbeln posnr matnr arktx四个字段(字段前必须加表名~)
SELECT vbap~vbeln vbap~posnr vbap~matnr vbap~arktx FROM vbap
  "条件:通过条件表vbak中的vbeln字段(主键)查询,所以两表的vbeln必须相等,产生表关联
  INNER JOIN vbak ON vbak~vbeln = vbap~vbeln
  "匹配字段查询后的数据放在内表gt_vbap中
  INTO CORRESPONDING FIELDS OF TABLE gt_vbap
  "限制vbak表的查询条件
  WHERE vbak~ernam = 'CHENGA'
  AND vbak~audat = '20190401'.
"通过vbeln posnr两个字段排序
SORT gt_vbap BY vbeln posnr.
"遍历表gt_vbapa到结构体gs_vbap中
LOOP AT gt_vbap INTO gs_vbap.
  WRITE: / gs_vbap-vbeln, / gs_vbap-posnr, / gs_vbap-matnr, / gs_vbap-arktx.
ENDLOOP.

你可能感兴趣的:(ABAP)