FLATTEN ビュー (データ構造のフラット化)

リレーショナルデータベースに格納されているデータは、int、text、long などの単純な型の値で構成されていることが普通です。しかし、他の型のソースでは、多くの場合、データが複合値で構成されています。たとえば No-SQL データベース、JSON ファイル、XML ファイル、Web サービスなどでは、データの構造はより複雑になります。

Virtual DataPort の拡張リレーショナルモデルでは複合データを扱うことができます。そのために、データ型 arrayregister が用意されています。

array 型の値はビューと考えることができます。array 型の値は必ず 1 つの "register" (テーブルの 1 行と考えることができます) で構成され、各 "register" は 1 つまたは複数のフィールドで構成されているからです。register 型値の各フィールドは単純な型 (text、int、long) または複合型 (register と array) とすることができます。1 つの array の各 register はすべて同じ構造を持ちます。

ほとんどの場合、次の理由から、複合値を返すソースから得られたデータは「フラット化」する必要があります。

  1. リレーショナルデータベースから得られたデータとフラット化したデータは容易に結合できる。

  2. 複合型をサポートしないツールからデータを利用する必要がある。

データを「フラット化」するには FLATTEN 操作を使用します。

FLATTEN 操作の構文
<flatten view> ::=
    FLATTEN <view identifier> AS <alias:identifier> ( <alias> [. <register field> ]* . <array field> )
  • <view identifier> はビューの参照です。たとえば、 customercustomer360.asset とします。

  • alias は、ビューを特定する識別子です。任意の識別子を使用できます。たとえば、 v とします。

  • 次に続く各パラメーターは、フラット化する配列への「パス」を形成します。配列がレジスター内部にある場合は、レジスターの名前の後に . を記述し、その後に配列の名前を記述する必要があります。

FLATTEN からは、ソースビューの各フィールド (フラット化する配列を除く) と、フラット化する配列フィールドのレジスターにあるすべてのフィールドが返されます。

たとえば average_revenue というビューがあり、そのビューには配列型のフィールド result の 1 つのみがあるとします。この配列内部のレジスターには 2 つのフィールド taxidrevenue があります。

以下のクエリでは、ビューのデータがフラット化され、"taxid" フィールドと "revenue" フィールドが返されます。

SELECT TAXID, REVENUE
FROM FLATTEN average_revenue AS V (v.result)