FLATTEN ビュー (データ構造のフラット化)¶
リレーショナルデータベースに格納されているデータは、int、text、long などの単純な型の値で構成されていることが普通です。しかし、他の型のソースでは、多くの場合、データが複合値で構成されています。たとえば No-SQL データベース、JSON ファイル、XML ファイル、Web サービスなどでは、データの構造はより複雑になります。
Virtual DataPort の拡張リレーショナルモデルでは複合データを扱うことができます。そのために、データ型 array
と register
が用意されています。
array 型の値はビューと考えることができます。array 型の値は必ず 1 つの "register" (テーブルの 1 行と考えることができます) で構成され、各 "register" は 1 つまたは複数のフィールドで構成されているからです。register 型値の各フィールドは単純な型 (text、int、long) または複合型 (register と array) とすることができます。1 つの array の各 register はすべて同じ構造を持ちます。
ほとんどの場合、次の理由から、複合値を返すソースから得られたデータは「フラット化」する必要があります。
リレーショナルデータベースから得られたデータとフラット化したデータは容易に結合できる。
複合型をサポートしないツールからデータを利用する必要がある。
データを「フラット化」するには FLATTEN
操作を使用します。
<flatten view> ::=
FLATTEN <view identifier> AS <alias:identifier> [( <alias> [. <register field> ]* . <array field> )]+
<view identifier>
はビューの参照です。たとえば、customer
やcustomer360.asset
とします。alias
は、ビューを特定する識別子です。任意の識別子を使用できます。たとえば、v
とします。次に続く各パラメータは、フラット化する配列への「パス」を形成します。配列がレジスター内部にある場合は、レジスターの名前の後に
.
を記述し、その後に配列の名前を記述する必要があります。フラット化する 1 つまたは複数の配列を指定できます。
FLATTEN
からは、ソースビューの各フィールド (フラット化する配列を除く) と、フラット化する配列フィールドのレジスターにあるすべてのフィールドが返されます。
例
たとえば average_revenue
というビューがあり、そのビューには配列型のフィールド result
の 1 つのみがあるとします。この配列内部のレジスターには 2 つのフィールド taxid
と revenue
があります。
以下のクエリでは、ビューのデータがフラット化され、"taxid" フィールドと "revenue" フィールドが返されます。
SELECT TAXID, REVENUE
FROM FLATTEN average_revenue AS V (v.result)