【问题标题】:SELECT into deep structure选择到深层结构
【发布时间】:2020-11-13 07:58:14
【问题描述】:

我对 ABAP 比较陌生,所以我仍然需要习惯内部表等, 所以目前我有点纠结于如何在 ABAP 中使用 SQL 来填充嵌套结构。

例如:

TYPES: BEGIN of <<mystructure>>,
         someID type sometype,
         relatedItemsInDataModel type table of sometabletype,
       END of <<mystructure>>.
DATA wa type <<mystructure>>.

<<SELECT INTO STATEMENT>>

DATA(lv_json) = /ui2/cl_json=>serialize( data = wa compress abap_true ... ).

所以基本上,我在字典中有一个表 (A),它与另一个表 (B) 有一对多的关系,我想选择 A 中的所有项目以及 AI 中的每个项目想要为该记录选择 B 中的所有相关项。

我想这样做的原因是因为我后来想将该数据转换为 JSON,如下所示:

[
 {
  "someID": "someValue",
  "relatedItemsInDataModel": [{...}, {...}]
 },
 {
  "someID": "someValue2",
  "relatedItemsInDataModel": [{...}, {...}, {...}, ...]
 },
 ...
]

那么,我一开始是不是以正确的方式来解决这个问题?如何才能实现我刚才描述的目标?

【问题讨论】:

  • 我认为不可能用标准 SQL 填充嵌套的结构化结构,因为 SQL 是关系型的而不是分层的。

标签: abap opensql


【解决方案1】:

SELECTs 只检索平面表。因此,您需要在多个步骤中检索嵌套数据并将其组装到 ABAP 代码中。

您的示例可能如下所示:

DATA the_ids_i_want TYPE RANGE OF sometype.

SELECT <field-list>
  FROM table_a
  INTO TABLE @DATA(selection_a)
  WHERE some_id IN @the_ids_i_want.

SELECT <field-list>
  FROM table_b
  INTO TABLE @DATA(selection_b)
  WHERE parent_id IN @the_ids_i_want.

LOOP AT selection_a INTO DATA(row_a).

  DATA(result_row) =
    VALUE <<mystructure>>(
      some_id = row_a-some_id ).

  LOOP AT selection_b INTO DATA(row_b)
      WHERE parent_id = row_a-some_id.
    
    INSERT VALUE #(
        field_a = row_b-field_a
        ... )
      INTO TABLE row_a-relatedItemsInDataModel.

  ENDLOOP.

ENDLOOP.

有很多方面可以优化,具体取决于您的数据。例如,WHERE 条件可能会根据外键关系的类型而有所不同,您可能要考虑将排序键添加到内部表中以加快 LOOP ... WHERE 查找速度,程序集可能会有更短的变体,使用FOR 而不是 LOOP AT 等 - 但基本上,这就是你所需要的。

【讨论】:

  • 非常感谢!我自己刚刚找到了一个类似的解决方案,但您的回答完美地解释了它。欣赏它。
猜你喜欢
  • 1970-01-01
  • 2014-09-19
  • 1970-01-01
  • 1970-01-01
  • 2013-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多