# DSQLマップでネスト化されたループをマッピング

Availability-note[Beta](https://help.talend.com/r/en-US/Cloud/labels-on-talend-help-center/availability-beta)

ベータ版コンテンツ

ネストされたループが複数含まれている入力から、エレメントをマッピングします。

## 始める前に

* 入力と出力のストラクチャーが作成済みであること。ストラクチャーの作成には下のJSONサンプルを使用できます。

## このタスクについて

この例では、ネスト化されたレベルが複数あるJSONファイルから店舗に関するデータを抽出し、フラットな階層ストラクチャーに書き込むDSQLマップを作成します。 入力データは次のようになります。

```
{
    "name": "plusstore",
    "location": "saint louis",
    "departments": [
        {
            "name": "sports",
            "salesperson_id": 25,
            "items": [
                {
                    "name": "MBIKE",
                    "description": "27.5 inch electric mountain bike"
                },
                {
                    "name": "ESCOOT",
                    "description": "Camou electric scooter"
                }
            ]
        },
        {
            "name": "electronics",
            "salesperson_id": 32,
            "items": [
                {
                    "name": "Portable SSD T5",
                    "description": "1 TB SSD USB-C"
                },
                {
                    "name": "Extreme Portable SSD",
                    "description": "500 GB SSD USB-C"
                }
            ]
        }
    ],
    "salespersons": [
        {
            "name": "Antonio Guttierez",
            "id": 25
        },
        {
            "name": "Gina Monsanto",
            "id": 32
        }
    ]
}
```

出力ストラクチャーは次のようになります。

```
{
    "items": [
        {
            "store_name": "",
            "store_location": "",
            "department_name": "",
            "salesperson_id": "",
            "salesperson_name": "",
            "item_name": ""
        }
    ]
}
```

## 手順

1. 新しいDSQLマップを作成して入力ストラクチャーと出力ストラクチャーを追加します。

   ルートエレメント間に最初のマッピングが自動的に作成されます。出力ストラクチャーのルートエレメントに、対応するData Shaping Query Languageの式が表示されます。 ![](https://help.qlik.com/talend/ja-JP/data-mapper-user-guide/Resources/images/tdm-dsql-map-editor-nested-loops-map.png)
2. items出力エレメントをクリックし、次の式を入力してルーピングコンテキストを設定します。
   ```
   FROM departments
   UNNEST items
   ```

   これによって、入力にある各departmentsエレメントにitemsエレメントが出現するたびに、itemsが1つ出力に含まれることになります。
3. 次のエレメントをドラッグ＆ドロップしてマッピングします。
   * plusstore.nameをplusstoreitems.items.store\_nameへ
   * plusstore.locationをplusstoreitems.items.store\_locationへ
   * plusstore.departments.nameをplusstoreitems.items.department\_nameへ
   * plusstore.departments.salesperson\_idをplusstoreitems.items.salesperson\_idへ
   * plusstore.departments.items.nameをplusstoreitems.items.item\_nameへ

   ほぼすべてのエレメントで、生成される式は単純な相対パスであることがわかります。store\_nameとdepartment\_nameの場合、ルーピングコンテキストが原因でname相対パスはplusstore.department.items.nameしか参照できないため、これは不可能です。詳細は、[DSQLエレメントパス](https://help.qlik.com/talend/ja-JP/data-mapper-user-guide/8.0/dsql-element-path)をご覧ください。
4. items出力エレメントをクリックし、既存の式の下に次の行を入力します。
   ```
   JOIN salespersons ON id = salesperson_id
   ```

   現在のルーピングコンテキストには入力エレメントがないので、plusstore.salespersons.nameとplusstoreitems.items.salesperson\_nameをマッピングするためにはこのJOIN句が必要になります。この句によってルーピングコンテキストが変更されます。出力のitem\_nameをクリックすると、式が相対パスでなくなり、絶対パスに置き換えられたことがわかります。
5. plusstore.salespersons.nameをplusstoreitems.items.salesperson\_nameにドラッグ＆ドロップします。

   ループピングコンテキストがsalespersons入力ループになったので、salesperson\_nameにある式はname相対パスになります。

## タスクの結果

マップが設定され、[Test Run] (テスト実行)機能を使った結果をチェックできるようになります。この例では、次の結果が返されます。

```
{
   "items":[
      {
         "store_name":"plusstore",
         "store_location":"saint louis",
         "department_name":"sports",
         "salesperson_id":"25",
         "salesperson_name":"Antonio Guttierez",
         "item_name":"MBIKE"
      },
      {
         "store_name":"plusstore",
         "store_location":"saint louis",
         "department_name":"sports",
         "salesperson_id":"25",
         "salesperson_name":"Antonio Guttierez",
         "item_name":"ESCOOT"
      },
      {
         "store_name":"plusstore",
         "store_location":"saint louis",
         "department_name":"electronics",
         "salesperson_id":"32",
         "salesperson_name":"Gina Monsanto",
         "item_name":"Portable SSD T5"
      },
      {
         "store_name":"plusstore",
         "store_location":"saint louis",
         "department_name":"electronics",
         "salesperson_id":"32",
         "salesperson_name":"Gina Monsanto",
         "item_name":"Extreme Portable SSD"
      }
   ]
}
```

また、[DSQL Script] (DSQLスクリプト)ビューでスクリプトの全容を確認することもできます。相対パスを使用するエレメントもあれば絶対パスを使用するエレメントもあることがわかります。

```
FROM plusstore
SELECT {
   items = (
      FROM plusstore.departments
      UNNEST items
      JOIN salespersons ON id = salesperson_id
      SELECT {
         store_name = plusstore.name,
         store_location = location,
         department_name = plusstore.departments.name,
         salesperson_id = salesperson_id,
         salesperson_name = name,
         item_name = plusstore.departments.items.name
      }
   )
}
```