UNNEST句を使用 - Cloud

Talend Data Shaping Languageリファレンスガイド

Version
Cloud
Language
日本語 (日本)
Product
Talend Cloud
Module
Data Shaping Language
Content
ジョブデザインと開発

UNNEST句を使って、ネストされたコレクションのネストを解除し、その親コレクションに結合します。

UNNESTキーワードは、ネストされたコレクションの識別子に後続される必要があります。親のFROM句またはUNNEST句で指定された内包コレクションの子であることが必要です。
FROM parent_identifier UNNEST child_identifier     

UNNEST句でASキーワードとINDEXキーワードを使用したり、複数の連続するUNNEST句を置いたりできます。

エイリアスのないUNNEST句を1つ以上使う時に、クエリーで使用されている識別子はすべて、最後のUNNEST句またはクエリー内の識別子が最後の句の一部ではない場合は、その親の句にある識別子の相対パスとして扱われます。

たとえば次の入力データでは:
{
   "customers":[
      {
         "name":"John Smith",
         "orders":[
            {
               "id":"abc-12345",
               "items":[
                  {
                     "id":"97516848-jiargn",
                     "quantity":2
                  }
               ]
            }
         ]
      },
      {
         "name":"Jane Doe",
         "orders":[
            {
               "id":"def-12345",
               "items":[
                  {
                     "id":"97516848-kftesn",
                     "quantity":3
                  },
                  {
                     "id":"96946848-metasb",
                     "quantity":1
                  }
               ]
            }
         ]
      }
   ]
}
UNNEST句を2つ使って、同じレベル上のcustomersコレクション、ordersコレクション、itemsコレクション内にあるデータを取得できます。
FROM customers UNNEST orders AS o UNNEST items AS i
SELECT {
	customer_name = name,
	order_id = o.id,
	item_id = i.id,
	item_quantity = quantity
}
nameという識別子とquantityという識別子が一意であるため、コレクションエイリアスでプレフィックスを付ける必要がありません。しかし、ordersコレクションとitemsコレクションの両方にidエレメントが含まれるため、エイリアスを使って、どちらが返されるべきかを指定する必要があります。このクエリーは次の結果を返します:
[
   {
      "customer_name":"John Smith",
      "order_id":"abc-12345",
      "item_id":"97516848-jiargn",
      "item_quantity":2
   },
   {
      "customer_name":"Jane Doe",
      "order_id":"def-12345",
      "item_id":"97516848-kftesn",
      "item_quantity":3
   },
   {
      "customer_name":"Jane Doe",
      "order_id":"def-12345",
      "item_id":"96946848-metasb",
      "item_quantity":1
   }
]