結合ビューの作成

結合ビューは、一連の入力ビューに対して、関係代数演算である結合を実行します。結合する各ビューは、互いに異なるデータベースに属していてもかまいません。

結合ビューを作成するには、[File] > [New] メニューで [Join] をクリックするか、[Server Explorer] で右クリックして [New] メニューで [Join] をクリックします。

[Join view] ダイアログが開き、[Server Explorer] で現在選択しているビューが追加されます。さらにビューを結合ビューに追加するには、[Model] タブをクリックして、追加するビューを [Server Explorer] からこのタブにドラッグします。

同じ結合ビューに 3 つ以上のビューを結合できます。

このマニュアルの例では、前の節で作成した incidents ビューと、「 SOAP Web サービスからの基本ビューの作成 」で作成した average_monthly_sales Web サービスビューを結合します。


[Join view] ダイアログには、以下の 6 つのタブがあります。

  1. Model: 結合を形成するビューをこのタブにドラッグします。

    簡潔な結合条件であれば、あるビューのフィールドと別のビューのフィールドをグラフィカルにリンクすることによって定義できます。条件で使用する演算子を構成するには、両方のフィールドを結合する矢印をダブルクリックして、適切な演算子を選択します。複雑な結合条件を追加するには [Join Conditions] タブを使用します。

    Design Studio では、2 段階の手順で結合条件を定義します。まず、ソースビュー右上の [link] ボタンをクリックして 2 つのビューを接続し、ターゲットビューにドラッグします。ソースビューが結合の左側ビュー、ターゲットビューが結合の右側ビューとしてそれぞれ表示されます。ビューを接続してから [link] をクリックすると、[Model] タブの一番下にダイアログが開き、両方のビューのフィールドが表示されます。このダイアログを使用して、左側ビューのフィールドを右側ビューの他のフィールドにグラフィカルにリンクして、簡潔な結合条件を追加します。

    Connecting two views using the Design Studio

    Design Studio を使用した、 internet_incphone_inc の接続

    交差結合を定義するには、ビューをダイアログにドラッグするだけですみます。フィールドはリンクしないでください。

    このタブで「ビューパラメーター」を追加できます。詳細については、「 派生ビューのパラメーター 」を参照してください。

  2. Join Conditions: 結合方法と結合条件を定義できます。

    1. 結合方法を構成します。そのためには、結合に使用する名前の間にある image0 アイコンをクリックします。以下のオプションが用意されています。

      1. Join type: [Inner]、[Left outer]、[Right outer]、および [Full]。

      2. Execution method: [Hash]、[Merge]、[Nested]、および [Nested parallel]。[Nested Parallel] を選択した場合は、並列サブクエリの最大数 ([Nested parallel number]) を指定する必要があります。[Any] オプションを選択すると、最適な結合方法が Virtual DataPort サーバーで選択されます。

      3. Order in which the input views are considered: [Ordered] を選択した場合、結合の左側のビューが 1 番目のビューと見なされます。

      4. 簡潔な型 (int、long など) のフィールドと複合型のサブフィールドの間で結合条件を定義する場合、複合型のサブフィールドを結合条件の左辺に配置する必要があります。

        たとえば、以下の 2 つのビューの結合ビューを作成するとします。

        1. view_a: int 型の f1 フィールドがあります。

        2. view_b: array 型の f2 フィールドがあります。この array には int 型の f2_af2_b の 2 つのサブフィールドがあります。

        f1 = f2_b とする結合条件は ... JOIN ... ON (f2).f2_b = f1 と定義する必要があります。つまり、配列のサブフィールドを結合条件の左辺に配置します。

      注釈

      これらの設定がクエリのパフォーマンスに大きく影響することがあります。詳細については、「 結合操作の最適化 」を参照してください。

    2. [Model] タブで追加した結合条件をクリックして編集します。

      [Add new condition] をクリックして新しい結合条件を定義し、[Add cross join] をクリックして 2 つのビューの間で交差結合を定義します。

      簡単なシナリオであれば、[Model] タブで結合条件と交差結合をグラフィカルに定義できます。しかし、複雑な状況では、[Join Conditions] タブでこれらを定義する必要があります。

      1. デフォルトでは、[New Join Condition] ダイアログで追加する条件は、条件を構成するすべてのフィールドが記述された最も内側の結合に追加されます。

        複雑な結合では、新しい条件が属する結合の指定が必要になることがあります。そのためには、[New Join Condition] ダイアログで一番下のチェックボックスをチェックして、ターゲット結合で使用するビューを選択します。

      2. [Model] タブでは、2 つのビューの交差結合の結果と別のビューとの間で結合を指定することはできません。たとえば、次のような結合は不可能です。

        (view_a CROSS JOIN view_b) INNER JOIN view_c ON view_a.field1 = view_c.fieldA
        

        注釈

        Design Studio で 2 つのビューの交差結合の結果と別のビューとの間で結合を定義するには、以下の手順に従います。

        1. view_a ビューと view_b ビューを接続します (結合条件は追加しないでください)。

        2. view_aview_c を接続します。

        3. view_a.field1 フィールドを view_c.fieldA フィールドに接続することによって、条件を追加します。

        Design Studio では、[Add cross join] ボタンを使用できません。

        このビューを作成するには、以下の手順に従います。

        1. 3 つのビューを [Model] タブにドラッグします。

        2. [Join Conditions] タブで [Add cross join] をクリックし、 view_aview_b を選択して [Ok] をクリックします。

        3. [Add join condition] をクリックし、条件として「 view_a.field1 = view_c.fieldA 」と入力します。次に、ダイアログの一番下のチェックボックスをチェックします。[Left subview] リストで (view_a CROSS JOIN view_b) を選択し、[Right subview] で view_c を選択します。

    ~ 演算子の意味については、「 相似性演算子を使用する結合条件 」を参照してください。

    注釈

    交差結合ビューの作成で必要な作業は、ビューを [Model] タブにドラッグすることだけです。[Model] タブ、[Join] タブ、[Where conditions] タブのいずれでも結合条件を定義しないでください。

    注釈

    「ビューパラメーター」であるフィールドを結合条件に使用しないでください。

  1. Where Conditions: ビューの定義に WHERE 条件を追加できます。

  2. Group By: ビューに GROUP BY 属性を追加できます。

  3. Output: ビューの出力を構成できます。具体的には、ビューとそのフィールドの名前の変更、派生属性の追加、ビューのプライマリキーの定義などができます。

  4. Metadata: 新しいビューの格納先フォルダーと説明を定義できます。

[Where Conditions]、[Group By]、[Output]、および [Metadata] の各タブの動作は [Union view] ダイアログの場合と同じです。使用方法の詳細については、「 和結合ビューの作成 」を参照してください。

Constructing the incidents and average_monthly_sales join view ("Model" tab)

incidents と average_monthly_sales との結合ビューの作成 ([Model] タブ)

このマニュアルの例では、以下の手順に従います。

  • [File] メニュー > [New] で [Join] をクリックします。

  • incidents ビューと average_monthly_sales ビューを [Model] タブにドラッグします。

  • 一方のテーブルにあるフィールド名 taxId を、もう一方のテーブルのフィールド名 taxId にドラッグして、結合条件 incidents.taxId=average_monthly_sales.taxId を追加します。

  • [Output] タブで以下の手順に従います。

    • ビューの名前を incidents_sales に変更します。

    • incidents.taxId フィールドを選択して [Remove selected] をクリックし、このフィールドを削除します。

つづいて、[Save] (image2) をクリックしてビューを作成すると、新しいビューのスキーマが表示されます。

Schema of the incidents_sales join view

incidents_sales 結合ビューのスキーマ

相似性演算子を使用する結合条件

Virtual DataPort は、相似性演算子を使用した結合条件をサポートしています。この演算子は、特定のアルゴリズムを使用してオペランド間の相似性を推定し、 0 から 1 の範囲の値を返します。パラメーターとして、比較するオペランドのほかに、使用する相似性アルゴリズムおよび 最小相似性しきい値 を受け取ります。オペランド間の類似性がこのしきい値を超えると、条件は true と評価されます。それ以外の場合は false です。

演算子 ~ (Alt-126) は、 text 型オペランド間の類似性を評価します。2 つのテキスト間に存在する編集上の相違度に基づく相似性アルゴリズムとして、以下が用意されています。

  • ScaledLevenshtein

  • JaroWinkler

  • Jaro

  • Level2Jaro

  • MongeElkan

  • Level2MongeElkan

また、以下に示す、2 つのテキストに使用されている単語の出現頻度に基づくアルゴリズムも用意されています。

  • TFIDF

  • Jaccard

  • UnsmoothedJS

上記以外に、これらのアルゴリズムを組み合わせた、 JaroWinklerTFIDF もあります。

アルゴリズムを指定していない場合は、適用するアルゴリズムが Virtual DataPort によって選択されます。その場合は、類似性のしきい値のみを指定します。

: ここでは、顧客を taxId ではなく、名前で特定している状況について考えます。この場合は、incidents データベースの顧客名が Web サービス sales の顧客名と正確には一致していないという問題があります。したがって、等価演算子による結合操作では適切な結果が得られません。類似性演算子を使用した結合によって、この問題に対処できます。

Denodo Platform に付属するインシデントの例を使用して、この状況を再現できます。2 つのリレーショナルテーブルとして internet_inc_cnamephone_inc_cname が用意されています。これらのテーブルは、この例で使用している internet_inc テーブルと phone_inc テーブルに似ていますが、顧客を特定する属性として、どちらにも taxId 属性ではなく、顧客の名前を示す customer_name 属性があります。Web サービス sales にも、すべての顧客の名前と月間収益で構成する複合データエレメントを返す GetAverageMonthlyRevenueCName 操作があります。この例で発生する問題を解決するには、以下の手順に従います。

  1. internet_inc_cnamephone_inc_cname の各テーブルから JDBC の基本ビューを作成します (「 JDBC データソースからの基本ビューの作成 」を参照)。

  2. Web サービス sales を開いて GetAverageMonthlyRevenueCName 操作の横にある [Create base view] をクリックし、[Do not stream output] を選択します。[Ok] をクリックして新しいビューのスキーマを確認し、[Save] をクリックしてそのビューを作成します。

  3. internet_inc_cnamephone_inc_cname から作成したそれぞれの基本ビューを結合します (「 結合ビューの作成 」を参照)。

  4. GetAverageMonthlyRevenueCName 操作から作成したビューによって返された複合データエレメントを「フラット化」します。「フラット化」プロセスの詳細については、「 フラット化ビューの作成 」を参照してください。

  5. 手順 3 で得られたビューと手順 4 で得られたビューとの間で、 customer_name フィールドを使用した結合ビューを定義します。結合演算子として ~ 演算子を指定し、類似性しきい値を 0.7 に設定します。

    注釈

    現在、Design Studio では簡易なエディターを使用できません。構文 join_incidents_cname.customer_name ~ (flatten_revenue_cname.cname,0.7) を使用して、結合の類似性条件を手動で設定する必要があります。この演算子に類似性アルゴリズムを指定するには、アルゴリズムの名前を一重引用符で囲んで 3 番目のパラメーターとして追加します。たとえば、 join_incidents_cname.customer_name ~ (flatten_revenue_cname.cname,0.7,'Jaro') とします。

  6. 手順 5 で得られたビューを実行します。入力ビューどうしで顧客名が正確には一致していないにもかかわらず、正しい結合が得られます。