仅使用 TABLES 声明进行内部连接

Inner join only with TABLES declaration

我需要编写一个在表 mara 和 makt 上使用内部联接的 ABAP 程序。我理解使用这样的数据声明的想法:

data: imatnr type mara-matnr,
      ematnr type makt-matnr.

select mara~matnr makt~matnr into (imatnr, ematnr) from mara left join makt on mara~matnr = makt~matnr.
  write: / imatnr, ematnr.
endselect.

在我的考试中,我必须编写一个没有内部表、字段符号的 ABAP 程序 JUST TABLES DEKLARATIONS。 我做了几次尝试,但没有找到答案。 我试过这样的事情:

tables: mara, makt.


select * from mara inner join makt on mara~matnr = makt~matnr.
  write: / mara-matnr, makt-matnr.
endselect.

控制台说,如果我想在 select * from 语句中使用 JOIN,我必须使用 INTO。

所以我的问题是:是否可以仅使用 TABLES 构建 JOIN 还是我仍然需要 DATA:

SQLselect离子查询之间的一些区别可能对您有帮助。

一个通用的 select 语句(没有任何特定类型)看起来像这样。

Select * from [table] where [field] = [value]

根据您是否以及如何指定 into 子句,使用某种类型的 select。


into table

into table select 一个或多个记录 进入内部 table。只能在您的 select 子句(字段列表)与内部 table.

结构 相同 时使用
   data: lt_ekko type table of ekko,
         ls_ekko type table of ekko,
   select * from ekko into table @lt_ekko.
   loop at lt_ekko into ls_ekko.
      write: / ls_ekko-ebeln.
   endloop.

into

into 表示您正在 select 进入变量(如果您 select 1 列)或结构(如果您 select 超过1).这很重要,因为结构只能和变量只能存储 1 个值或行,这意味着您必须 指定您正在 selecting single 或使用select/endselect 语句执行循环 select.

  data: ls_ekko type ekko.
  select single * from ekko into @ls_ekko where ebeln = [some number]
  write: / ls_ekko-ebeln.

    select * from ekko into @ls_ekko where ebeln = [some number].
       write: / ls_ekko-ebeln. "will print one for each row
    endselect.

into corresponding fields of (table)

into corresponding fields of(和into corresponding fields of table)selects 的记录方式与intointo internal table 相同。区别在于您的结构或内部 table 不必与您的 selected 字段列表相同。所选字段将存储到您的 table/structure 同名字段中。

  data: ls_ekko type ekko.
  select single ebeln, bukrs from ekko into @ls_ekko where ebeln = [some number].
  write: / ls_ekko-ebeln.

into条款

into子句类似于into[结构],因为它只能select1条记录。这意味着您必须指定 select 一条 single 记录。 注意:您 select 来自的表必须在程序中声明才能使用这种类型的 select。

  select single * from ekko where ebeln = [some number].
  write: / ekko-ebeln.

由于您没有使用 into 子句,您使用的是最后一种类型,这意味着您必须使用 select single

So my question is:

Is it possible to build an JOIN only with tables: mara, makt.

没有。 Table 是工作区又名平面结构,关键字是 flat。您不能 select 仅使用 TABLES 多行并且不能加入 TABLES 工作区。

顺便说一句,表格 help guidelines 清楚地说

No table work areas except for classic dynpros

忘掉这些过时的东西吧。

如果您的考试和学习课程只要求您使用 TABLES,那么 运行 远离这些课程和学校。请运行离开。

P.S。满足您讨厌的要求的唯一方法是嵌套 SELECT:

TABLES: mara, makt.

SELECT * FROM mara
  INTO mara.
  WRITE: / `MARA selected: `, mara-matnr.
  SELECT *
    INTO makt
    FROM makt WHERE matnr = mara-matnr.
    WRITE: / `MAKT selected: `, makt-matnr.
  ENDSELECT.
ENDSELECT.

但这感觉很恶心。