データの結合
複数の関連するデータソースを結合して大規模な統合データ構造を作成し、そのデータ構造から単一リクエストでレポートを作成することができます。この結合 (JOIN) は仮想構造です。結合された複数のデータソースには、単一データソースのようにアクセスすることができます。合計 512 個のセグメントに対して、一度に 511 個までの JOIN を有効にすることができます。この値は使用中のセグメントの数、およびフィールドの数と長さにより異なります。すべてのフィールドの長さには 256 キロバイトの制限があります。ファイルを結合しても、物理的には別個のファイルのままですが、そのセッションの間、または JOIN をクリアするまでは、1 つのデータソース構造として扱われます。
クラスタ JOIN エディタを使用して、リレーショナルテーブルの既存のシノニムを結合することで、レポートの新しいファイル構造を作成することもできます。
JOIN とは
JOIN は、複数のデータソースが 1 つ以上の共通フィールドに基づいて、または JOIN コマンドで指定した条件に基づいて作成される一時的な結合です。たとえば、wf_retail_sales データソースに ID_STORE フィールドがあり、wf_retail_store データソースにも ID_STORE フィールドがある場合、これらの 2 つのデータソースを結合して JOIN を作成することができます。
共通フィールドのデータタイプは一致している必要がありますが、フィールド名およびフィールドフォーマットが一致している必要はありません。
2 つのファイルを結合すると、1 つ目のファイル (ホストデータソース) からレコードが取得されるたびに、そのレコードに対応するレコードが 2 つ目のファイル (クロスリファレンスデータソース) からも取得されます。
JOIN 機能による JOIN の作成
ここでは、JOIN 機能を使用して作成可能な JOIN のタイプについて説明します。
- EQUIJOIN 少なくとも 1 つのフィールドを共有する複数のデータソースを結合し、レポートの作成に使用可能な仮想構造を作成します。詳細は、データの結合を参照してください。
- 条件付き JOIN (WHERE ベース) 式を使用して、フィールド間の等価性のみでなく、条件に基づく結合を指定します。詳細は、データの結合を参照してください。
- 一時項目に基づく JOIN (DEFINE ベース) ホストファイルの一時項目 (DEFINE) を、クロスリファレンスファイルの実フィールドに結合します。詳細は、データの結合を参照してください。
- LEFT OUTER JOIN ホストデータソースの行に対応する行がクロスリファレンスデータソースに存在しない場合でも、一致する行のすべてと、ホストデータソースのすべての行が返されます。詳細は、データの結合を参照してください。
- FULL OUTER JOIN ホストデータソースのすべての行と、クロスリファレンスデータソースのすべての行が返されます。FULL OUTER JOIN は、このタイプの JOIN をサポートするリレーショナルデータソースを使用する場合にサポートされます。詳細は、データの結合を参照してください。
EQUIJOIN の作成
EQUIJOIN 構造は、結合する 2 つのデータソースのそれぞれに共通のフォーマット (文字、数値、または日付) および値が含まれたフィールドがあり、これらの 2 つのフィールドに基づいてデータソースを結合する場合に使用することができます。
EQUIJOIN の例として、売上データソース (ホストデータソース) の店舗 ID フィールドと、店舗データソース (クロスリファレンスデータソース) の店舗 ID フィールドに基づいたデータソース結合があります。
条件に基づく JOIN の作成
条件付き JOIN では、WHERE ベースの構文を使用して、フィールド間の等価性のみでなく、条件に基づいて JOIN を作成します。また、ホストおよびクロスリファレンス JOIN フィールドに一致するフォーマットが含まれている必要はありません。
たとえば、1 つ目のデータソース (ホストデータソース) には、店舗 ID で識別される店舗のリストが格納され、2 つ目のデータソース (クロスリファレンスデータソース) には、店舗 ID ごとの日付別売上のリストが格納されている場合を想定します。条件付き JOIN を使用すると、ホストデータソースの店舗 ID フィールドとクロスリファレンスデータソースの店舗 ID フィールドを結合し、WHERE 条件で指定した日付範囲内で売上を達成した店舗を特定することができます。
一時項目 (DEFINE) に基づく JOIN の作成
一時項目 (DEFINE) に基づく JOIN は、DEFINE ベースの構文を使用してホストデータソースに一時項目 (DEFINE) を作成し、その一時項目 (DEFINE) をクロスリファレンスファイルの実フィールドに結合するという方法で作成します。ホストデータソースに一時項目 (DEFINE) を作成する DEFINE 式には、ホストデータソースの実フィールドと定数のみを含めることができます。クロスリファレンスデータソースのフィールドを含めることはできません。
1 つの一時項目 (DEFINE) を複数のクロスリファレンスデータソースの複数の実フィールドに結合することができます。この JOIN を作成するには、クロスリファレンスデータソースごとに JOIN コマンドを使用し、それぞれが同一のホストデータソースを参照するようにします。
LEFT OUTER JOIN の作成
ホストデータソースの行に対応する行がクロスリファレンスデータソースに存在しない場合、存在しない行を除外し、一致する行のみをレポートに表示するには、「INNER JOIN」と呼ばれる JOIN を使用します。ホストデータソースの行に対応する行がクロスリファレンスデータソースに存在しない場合でも、一致する行のすべてと、ホストデータソースのすべての行をレポートに表示するには、「LEFT OUTER JOIN」と呼ばれる JOIN を使用します。
LEFT OUTER JOIN 構文についての詳細は、『ibi™ WebFOCUS® Language リファレンス』を参照してください。
FULL OUTER JOIN の作成
WebFOCUS の JOIN コマンドおよび条件付き JOIN コマンドには、FULL OUTER JOIN オプションがあります。
FULL OUTER JOIN を使用すると、ホストデータソースのすべての行と、クロスリファレンスデータソースのすべての行が返されます。いずれかのデータソースの行に値が存在しない場合は、NULL 値が返されます。レポート出力では、これらの値はデフォルト値に置き換えられ、文字フィールドではブランク、数値フィールドでは NODATA 記号になります。
FULL OUTER JOIN がサポートされるのは、このタイプの JOIN をサポートするリレーショナルデータソースを使用する場合に限られます。この場合、WebFOCUS の JOIN 構文が最適化されます (RDBMS でサポートされる FULL OUTER JOIN SQL 構文に変換)。FULL OUTER JOIN をサポートしないデータソースでこの構文を使用した場合や、エンジンに送信されるリクエストの最適化に失敗した場合、エラーメッセージが生成されます。
FULL OUTER JOIN 構文についての詳細は、『ibi™ WebFOCUS® Language リファレンス』を参照してください。
単一 (ユニーク) インスタンス JOIN と複数 (非ユニーク) インスタンス JOIN の指定
JOIN 機能を使用して JOIN を作成する際に、JOIN を単一インスタンスにするか、複数インスタンスにするかを指定することができます。
- 単一インスタンス JOIN 構造 (1 対 1 の JOIN 構造) では、ホストデータソースの 1 つの値とクロスリファレンスデータソースの 1 つの値を一致させます。
1 対 1 の JOIN 構造の例として、売上データソース (ホストデータソース) の店舗 ID フィールドと、店舗データソース (クロスリファレンスデータソース) の店舗 ID フィールドに基づいたデータソース結合があります。
- 複数インスタンス JOIN 構造 (1 対 n の JOIN 構造) では、ホストデータソースの 1 つの値とクロスリファレンスデータソースの複数の値を一致させます。
たとえば、1 つ目のデータソース (ホストデータソース) には、店舗 ID で識別される店舗のリストが格納され、2 つ目のデータソース (クロスリファレンスデータソース) には、店舗 ID ごとの製品売上のリストが格納されている場合を想定します。1 対 n の JOIN 構造の例として、ホストデータソースの店舗 ID の 1 つのインスタンスを、クロスリファレンスデータソースの複数の店舗 ID に結合する JOIN があります。この JOIN からは、店舗 ID ごとに販売された製品がすべて返されます。
JOIN に追加するデータソースの操作 - JOIN タブの使用
[JOIN] タブでは、複数のデータソースを結合して JOIN を作成することができます。[JOIN] タブは、JOIN の作成時にのみ使用できます。
2 つのファイルを結合すると、1 つ目のファイル (ホストデータソース) からレコードが取得されるたびに、そのレコードに対応するレコードが 2 つ目のファイル (クロスリファレンスデータソース) からも取得されます。
データソースの結合 - JOIN グループの使用
[JOIN] グループを使用して、新しい JOIN の作成、JOIN へのデータソースの追加、JOIN のクリア、JOIN への一時項目 (DEFINE) の追加、条件付き JOIN の作成、プロシジャ (.fex) ウィンドウの表示と非表示の切り替え、テーブル内での自動 JOIN の実行、データソースの混合を行えます。下図は、[JOIN] グループを示しています。
JOIN に追加されたデータソースの表示 - ウィンドウグループの使用
[ウィンドウ] グループを使用して、JOIN に現在追加されているデータソースの表示方法を選択することができます。これらの表示方法には、[重ねて表示] (デフォルト)、[横] (横に並べて表示)、[縦] (縦に並べて表示) があります。下図は、[ウィンドウ] グループを示しています。
JOIN キャンバスでの JOIN の作成
JOIN キャンバスを使用して、2 つ以上のデータソースを結合することができます。JOIN コンポーネントを使用すると、あらゆるタイプの JOIN をグラフィカルに作成、編集することができます。JOIN を作成するには、最初にホストデータソースを指定し、次にクロスリファレンスデータソースを指定する必要があります。
開発者は、JOIN コンポーネントをプロシジャ内の正しい位置 (つまり、一時項目 (DEFINE) またはレポートの前) に配置した上で、プロシジャを実行する必要があります。セッション中の JOIN は、明示的にクリアしない限り、アクティブな状態で保持されます。
JOIN が作成されると、JOIN の検索、レポート作成、JOIN 構文の表示、JOIN のクリアを実行することができます。
EQUIJOIN を作成するには
- 手順
- 既存のプロシジャを開くか、新しいプロシジャを作成します。
- [プロシジャビュー] パネルで、JOIN を作成するプロシジャフォルダを右クリックするか、JOIN を作成する 1 つ前のコンポーネントを右クリックし、[新規作成]、[JOIN] を順に選択します。
- マスターファイル (ホストデータソース) を選択し (例、wf_retail_sales)、[OK] をクリックします。
JOIN キャンバスが開き、マスターファイル内のフィールドのリストが表示されます。
- [JOIN] タブの [JOIN] グループで、[追加] をクリックします。
別の方法として、JOIN キャンバスを右クリックし、[ファイルの追加] を選択することもできます。
- マスターファイル (クロスリファレンスデータソース) を選択し (例、wf_retail_store)、[OK] をクリックします。
新しいマスターファイルがキャンバスに追加されます。下図のように、両方のファイルで共通のフィールドが JOIN 接続線で結合されます。
- [保存] をクリックします。
- [実行] をクリックします。
ダイアログボックスが開き、コンポーネントのコードとともに、エラーメッセージが表示されるか、エラーが存在しないことを示すテキストが表示されます。
以下は、作成された WebFOCUS JOIN 構文を示しています。
JOIN WF_RETAIL_SALES.WF_RETAIL_SALES.ID_STORE IN wf_retail_sales TO WF_RETAIL_STORE.WF_RETAIL_STORE.ID_STORE IN wf_retail_store AS J0 END
複数フィールド JOIN の作成
複数のホストフィールドと 1 つまたは複数のクロスリファレンスフィールドとの結合が必要な場合があります。
複数フィールド JOIN には、次の 2 つのタイプがあります。
- 複数フィールド JOIN - 複数のホストフィールドを複数のクロスリファレンスフィールドに結合します。
- 連結 JOIN - 2 つのホストフィールドを連結した後のフィールドを 1 つのクロスリファレンスフィールドに結合します。
JOIN フィールドとして使用する一時項目 (DEFINE) の作成
ホストデータソースに一時項目 (DEFINE) を作成し、そのフィールドをクロスリファレンスデータソースの実フィールドに結合することができます。
一時項目 (DEFINE) を JOIN フィールドとして使用するには
- 手順
- 既存のプロシジャを開くか、新しいプロシジャを作成します。
- [プロシジャビュー] パネルで、JOIN を作成するプロシジャフォルダを右クリックするか、JOIN を作成する 1 つ前のコンポーネントを右クリックし、[新規作成]、[JOIN] を順に選択します。
- マスターファイル (ホストデータソース) を選択し、[OK] をクリックします。
JOIN キャンバスが開き、マスターファイル内のフィールドのリストが表示されます。
- [JOIN] タブの [JOIN] グループで、[DEFINE] をクリックします。
[ファイル中の JOIN DEFINE] ダイアログボックスが開きます。
- 次の手順を実行し、一時項目 (DEFINE) をデータソースのセグメントと関連付けます。
- [DEFINE フィールド] テキストボックスに、定義する一時項目 (DEFINE) の名前を入力します。
- [フィールド] ドロップダウンリストで、一時項目 (DEFINE) を配置するセグメントから任意の実フィールド名を選択し、[OK] をクリックします。
ホストデータソースの [フィールド] ウィンドウに一時項目 (DEFINE) が表示されます。
- [JOIN] タブの [JOIN] グループで、[追加] をクリックします。
別の方法として、JOIN キャンバスを右クリックし、[ファイルの追加] を選択することもできます。
- マスターファイル (クロスリファレンスデータソース) を選択し、[OK] をクリックします。
新しいマスターファイルがキャンバスに追加されます。既存の JOIN 接続線を削除します。
- JOIN を作成するには、一時項目 (DEFINE) をドラッグし、クロスリファレンスデータソースの対応するフィールドにドロップします。
この方法で複数のフィールドを結合することはできません。一時項目 (DEFINE) は、唯一の JOIN フィールドである必要があります。
条件付き JOIN の作成
条件付き JOIN を使用すると、フィールド間の等価性とは別の条件に基づいて JOIN を設定することができます。さらに、ホストおよびクロスリファレンス JOIN フィールドに同一フォーマットを含めたり、クロスリファレンスフィールドにインデックスを付ける必要がなくなります。
各データソースは複雑な条件の処理能力において異なるため、WHERE 構文の最適化は JOIN に関わる特定データソースおよび条件の複雑さにより異なります。
結合されたデータソースのリストを表示するには、クエリツールで次のクエリ対象を選択します。
?JOIN
このクエリにより、現在有効な JOIN がすべて表示され、条件に基づく JOIN であることも示されます。
条件付き JOIN を作成するには
- 手順
- 既存のプロシジャを開くか、新しいプロシジャを作成します。
- [プロシジャビュー] パネルで、JOIN を作成するプロシジャフォルダを右クリックするか、JOIN を作成する 1 つ前のコンポーネントを右クリックし、[新規作成]、[JOIN] を順に選択します。
- マスターファイル (ホストデータソース) を選択し、[OK] をクリックします。
JOIN キャンバスが開き、マスターファイル内のフィールドのリストが表示されます。
- [JOIN] タブの [JOIN] グループで、[追加] をクリックします。
別の方法として、JOIN キャンバスを右クリックし、[ファイルの追加] を選択することもできます。
[データサーバ] または [ワークスペース] エリアで開発中の場合は、[データソースの選択] ダイアログボックスが開きます。
- マスターファイル (クロスリファレンスデータソース) を選択し、[OK] をクリックします。
新しいマスターファイルがキャンバスに追加されます。両方のファイルで共通のフィールドが JOIN 接続線で結合されます。
- JOIN 接続線を選択し、[JOIN] タブで [選択条件] をクリックします。
[WHERE 条件式ビルダ] ダイアログボックスが開きます。
- WHERE 条件を指定した後、[OK] をクリックして JOIN キャンバスに戻ります。
JOIN タイプまたは JOIN 名を変更する必要がある場合は、条件付き JOIN をダブルクリックして [JOIN のプロパティ] ウィンドウを開きます。
JOIN のカスタマイズ
使用されているファイルまたはフィールドを変更することにより、既存の JOIN をカスタマイズできます。デフォルトの JOIN が作成されなかった場合も、同じ方法で接続を明示的に指定できます。
また、JOIN 名の変更、JOIN の単一インスタンス化、JOIN フィールドとしての一時項目の使用、JOIN ファイルへのタグ名の追加を行うこともできます。
JOIN からデータソースを削除するには
- 手順
- 削除するデータソースをクリックします。
- Delete キーを押します。確認ダイアログボックスが表示されます。
ホストデータソースを削除すると、すべてのクロスリファレンスデータソースが自動的に削除されます。
JOIN を削除するには
- 手順
- JOIN 接続線を右クリックします。
- コンテキストメニューから [削除] を選択します。
別の方法として、JOIN 接続線を選択し、[JOIN] タブの [JOIN] グループで [クリア] をクリックするか、Delete キーを押すこともできます。
JOIN に使用されていたデータソースは、接続線で結合されていない状態でキャンバスに残ります。
JOIN フィールドを指定するには
ユーザ独自の JOIN を作成するには (必要に応じて既存の JOIN を削除してから作成)、次の手順を実行します。
- 手順
- ホストデータソースパネルでフィールドを選択します。
- 選択したフィールドをクリックし、マウスボタンを押したままにします。
- ホストデータソースパネルで選択したフィールドをドラッグし、クロスリファレンスデータソースパネルの対応するフィールド上にドロップします。JOIN の作成が可能な場合は、マウスポインタの形状が変わります。
- マウスボタンを離します。
JOIN 接続線が表示されます。
追加の JOIN を作成するには
JOIN キャンバスで追加の JOIN を作成するには、次の手順を実行します。
- リボンの [新規作成] をクリックします。
- JOIN キャンバスを右クリックし、コンテキストメニューから [新規 JOIN] を選択します。
同時に作成可能な JOIN の最大数は 511 個で、新しい JOIN 構造には最大で 512 個のセグメントを含めることができます。
単一インスタンス JOIN に変更するには
デフォルト設定では、各 JOIN は複数インスタンス JOIN です。
単一インスタンス JOIN に変更するには、次の手順を実行します。
- 手順
- JOIN 接続線を右クリックします。
- コンテキストメニューから [単一インスタンス] を選択します。
JOIN 名の変更
各 JOIN には、デフォルトの名前が自動的に割り当てられます。
JOIN 名を変更すると、後から JOIN を削除する際に識別しやすくなるだけでなく、別の JOIN によって上書きされなくなります。JOIN 名を完全に削除した場合、後続の名前の付いていない JOIN によってその JOIN が上書きされます。
デフォルトの JOIN 名を変更または削除するには
- 手順
- JOIN 接続線を右クリックし、コンテキストメニューから [JOIN 名] を選択します。
[JOIN 名] ダイアログボックスにデフォルトの JOIN 名が表示されます。
- [JOIN 名] テキストボックスで名前を編集または削除し、[OK] をクリックします。
説明を入力することもできます。この説明は JOIN コマンドでは使用されませんが、参考情報として入力することができます。プロシジャにコメント行 (-*) として追加されます。たとえば、「-*JOINDESC J0」のように記述されます。
注意:ALL、AND、AS、IN、JOIN、TAG、TO、WITH という語句は、JOIN 名には使用できません。
タグ名の追加
ホストデータソースのフィールドとクロスリファレンスデータソースのフィールドが同一名の場合に、タグ名を追加することで、これらのフィールドを区別することができます。JOIN では、タグ名はファイル名のエイリアスとして機能します。特定のファイルをそのファイル自体に結合すると、ホストデータソースとクロスリファレンスデータソースのフィールド名、セグメント名、ファイル名がすべて同一になるため、このような JOIN でタグ名が役立ちます。また、JOIN 構造で特定のファイルをターゲットとして複数回使用する場合にもタグ名が役立ちます。
プロシジャでは、データソースのタグ名をフィールド名の修飾子やエイリアスとして使用することができます。
タグ名が指定されていない再帰的 JOIN を使用してレポートを作成すると、クロスリファレンスデータソースのフィールド名の前に JOIN 名の先頭 4 文字が付けられます。
タグ名を追加するには
- 手順
- テーブル間の接続線をダブルクリックします。[JOIN のプロパティ] ダイアログボックスが表示されます。
[JOIN のプロパティ] ダイアログボックスは、JOIN 接続線を右クリックし、コンテキストメニューから [プロパティ] を選択して表示することもできます。JOIN が選択されると、太線が表示されます。
- [ホストタグ] テキストボックスと [クロスタグ] テキストボックスに名前を入力し、[OK] をクリックします。
注意
- タグ名に、ALL、AND、AS、IN、JOIN、TAG、TO、WITH という予約語を使用することはできません。
- タグ名の長さの最大値は 8 バイトです。
JOIN のプロパティダイアログボックス
JOIN のプロパティを表示または変更するには、JOIN 接続線を右クリックして [プロパティ] を選択するか、JOIN 接続線をダブルクリックします。下図のように、[JOIN のプロパティ] ウィンドウが表示されます。
[JOIN のプロパティ] ウィンドウには、次の項目とオプションがあります。
データソースのタグ名を入力します。
クロスリファレンスファイルのタグ名を入力します。
ホストファイルからクロスリファレンスファイルへ結合されたフィールドを表示します。矢印が 1 つのときは、ユニーク JOIN を表し、2 つのときは非ユニーク JOIN を表します。
JOIN の名前を表示します。デフォルトの JOIN 名を変更するには、このテキストボックスに名前を入力し、[OK] をクリックします。
注意:JOIN 名には、8 バイト以内の一意の名前を指定する必要があります。
説明を入力します。この値は JOIN コマンドでは使用されません。この項目は参照用に用意されています。プロシジャにコメント行 (-*) として追加されます。
JOIN のタイプを選択します。次のオプションから選択します。
複数インスタンス (非ユニーク) 1 対 n の JOIN 構造です。ホストデータソースの 1 つの値とクロスリファレンスデータソースの複数の値を一致させます。従業員データソースの従業員 ID を研修コースデータソースの従業員 ID に結合すると、各従業員が受講したすべての研修コース (複数のコースを受講した場合もあり) のリストを作成することができます。つまり、ホストファイルの従業員 ID (単一インスタンス) が、クロスリファレンスファイルの従業員 ID (複数インスタンス) に結合されることになります。これがデフォルト値です。
単一インスタンス (ユニーク) 1 対 1 の JOIN 構造です。ホストデータソースの 1 つの値とクロスリファレンスデータソースの 1 つの値を一致させます。ユニーク JOIN の一例として、従業員データソースの従業員 ID と、給与データソースの従業員 ID を結合する場合があります。
指定しない このオプションは、以前のバージョンで作成された JOIN を JOIN ツールで開いた場合に選択されます。以前のバージョンで作成された JOIN の JOIN タイプおよび他の演算子は、生成されたコードに記述されていません。JOIN ツールでは以前のバージョンで作成された JOIN タイプや JOIN を制御する他のコマンドを特定できないため、JOIN ツールで適切なオプション (INNER JOIN、LEFT OUTER JOIN、複数インスタンス、単一インスタンス) を選択して、コードを再生成する必要があります。
INNER JOIN クロスリファレンスファイルに存在しないレコードを除外し、ホストファイルとクロスリファレンスファイル間で一致するレコードのみをレポートに表示する JOIN です。
LEFT OUTER JOIN INNER JOIN の結果を拡張し、ホストファイルとクロスリファレンスファイル間で一致するレコード以外に、ホストファイルのすべてのレコードをレポートに表示する JOIN です。この JOIN では、ホストテーブルのレコードに対応するレコードがクロスリファレンステーブルに存在しない場合でも、ホストテーブルのレコードがすべて取得されます。
ファントラップおよびキャズムトラップの検知と処理
WebFOCUS では、多数のデータソース間での複雑な JOIN がサポートされます。複雑な JOIN (またはスタースキーマ) に対してリクエストを発行した際に、特定のフィールドが複数回集計され、過剰な結果が生成される場合があります。このような構造は、ファントラップまたはキャズムトラップと呼ばれます。
リレーショナルアダプタの新しいコンテキスト分析プロセスでは、この乗算が検知され、各セグメントコンテキストの正しい値を取得する SQL スクリプトコマンドが生成されます。これらのスクリプトは、最適化された SQL ステートメントのサブクエリとして RDBMS に渡されます。