Oracle® Fusion Middleware Oracle Business Intelligence Discoverer管理者ガイド 11gリリース1 (11.1.1) E51906-01 |
|
前 |
次 |
この章では、Discoverer Administratorを使用した結合の実装方法について説明します。この章の内容は次のとおりです。
Discovererの結合では、1つ以上の一致するアイテムを使用して2つのフォルダを関連付けます。データベースの結合では、一致する列を使用して2つのテーブルを関連付けます。
たとえば、DEPTとEMPという2つのテーブルを考えてみます。
DEPTテーブルの各部門には、部門名および部門番号が付いています。EMPテーブルの各従業員には名前があり、各自が1つの部門に属しています(部門は部門番号で識別します)。
従業員の名前およびその従業員が働く部門の名前を確認するには、両方のテーブルから情報を抽出する必要があります。しかし、同じクエリーで両方のテーブルから情報を抽出できるようにするには、テーブルの間に結合が存在する必要があります。
結合を定義するには、通常は他のテーブルの列と一致する1つの列をテーブルの中で指定します。DEPTテーブルとEMPテーブルの例では、DEPTテーブルのDEPTNO列がEMPテーブルのDEPTNO列と一致します。つまり、DEPTテーブルのDEPTNO列の各値には、EMPテーブルのDEPTNO列に一致する値があります。
結合は、一般にマスター・テーブルとディテール・テーブルで構成されます。マスター・テーブルの1行に対し、ディテール・テーブルには複数の行が存在します。前述の例では、DEPTテーブルがマスター・テーブルでEMPテーブルがディテール・テーブルです。各部門には複数の従業員がいるからです。
ディテール・テーブルの一致する列は、一般的に外部キー列と呼ばれます。
Discoverer Administratorを使用して結合を作成するときは、マスター・フォルダ内のアイテムとディテール・フォルダ内の一致するアイテムを識別する結合条件を指定します。次の点に留意することが重要です。
正しいフォルダをマスターにして結合を定義すること。クエリーに2つ以上のフォルダが使用される場合に不適切なフォルダをマスターに定義していると、誤りやすいまたは誤った結果を受け取る場合があります(詳細は、「ファントラップの概要およびDiscovererでの処理方法」を参照)。
正しい結合オプション詳細を選択すること。これらの詳細により、クエリーの速さを向上するためにサマリー・フォルダを使用できるかどうかも決まります(詳細は、「クエリー結果およびクエリーのパフォーマンスに結合が与える影響」を参照)。
2つのフォルダ間に結合を定義すると、次のことが可能になります。
Discovererエンド・ユーザーは、両方のフォルダからのアイテムをDiscoverer Plus (およびDiscoverer Desktop)の同じワークシートに含めることができます。
Discovererマネージャは、両方のフォルダからのアイテムを含む複合フォルダおよび階層をDiscoverer Administrator内に作成できます。
Discovererの単一アイテム結合では、両方のフォルダに共通するアイテムを結合条件で指定して、2つのフォルダを関連付けます。結合条件とは、結合演算子によって関連付けられる2つの結合アイテムの組合せです。通常、結合演算子には等号(=)が使用されるため、このような結合は等価結合と呼ばれます(他の結合演算子の詳細は、「非等価結合」を参照)。
たとえば次のスキーマでは、共通する列であるDEPTNOを使用してDEPTテーブルとEMPテーブルを結合します。
DEPTテーブルの各部門には、部門名および部門番号が付いています。EMPテーブルの各従業員には名前があり、各自が1つの部門に属しています(部門は部門番号で識別します)。従業員の名前およびその従業員が働く部門の名前を確認するには、EMPテーブルとDEPTテーブルの両方からの情報が必要です。
Discovererエンド・ユーザーが、すべての従業員の名前と各自が働く部門の名前を次のように表示しようとする場合を想定します。
DNAME | ENAME |
---|---|
ACCOUNTS | CLARK |
ACCOUNTS | MILLER |
RESEARCH | ADAMS |
RESEARCH | FORD |
SALES | JAMES |
つまり、DEPT.DNAMEおよびEMP.ENAMEを表示します。
次のSQL文により、必要な結果が得られます。
select dname, ename from dept, emp where dept.deptno=emp.deptno
Discovererエンド・ユーザーが必要な結果を表示できるようにするには、次のいずれかを行います。
前述のSQL文を含むカスタム・フォルダの作成(詳細は、「カスタム・フォルダの作成方法」を参照)
DEPT.DEPTNOとEMP.DEPTNOの間の結合条件が1つの結合(単一アイテム結合)の作成(詳細は、「結合の作成方法」を参照)。
結合を定義すると、次のことが可能になります。
Discoverer Administratorで複合フォルダを作成し、DEPTからDNAMEを、EMPからENAMEを複合フォルダにドラッグできます(詳細は、「複合フォルダの作成方法」を参照)。
Discovererエンド・ユーザーがこの複合フォルダを使用できます。あるいは、DEPTからDNAMEを、EMPからENAMEを選択することもできます。
Discovererのマルチアイテム結合では、すべての結合条件が満たされたときに結合が真になるように、複数の結合条件を使用して2つのフォルダが関連付けられます(結合条件の詳細は、「単一アイテム結合」を参照)。
たとえば次のスキーマでは、COUNTRY_CODEとPRODUCT_CODEの組合せを使用して、製品を一意に識別します。
VIDEO_PRODUCTSテーブルのそれぞれの製品には説明があり、国コードと製品コードの組合せで一意に識別されます(製品コードはそれぞれの国コードにおいてのみ一意であることに注意してください)。VIDEO_SALESテーブルのそれぞれの売上は、特定の製品のものです(国コードと製品コードで識別されます)。売上の値および販売された製品の説明を確認するには、VIDEO_SALESテーブルとVIDEO_PRODUCTSテーブルの両方からの情報が必要です。
Discovererエンド・ユーザーが、各売上の値および販売された製品の説明を次のように表示しようとする場合を想定します。
説明 | 値 |
---|---|
UK GAME RENTAL | 10 |
US VIDEO RENTAL | 19 |
FR VIDEO SALES | 25 |
FR GAME RENTAL | 8 |
つまり、VIDEO_PRODUCTS.DESCRIPTIONおよびVIDEO_SALES.VALUEを表示します。
次のSQL文により、必要な結果が得られます。
select description, value from video_products, video_sales where video_products.country_code=video_sales.country_code and video_products.product_code=video_sales.product_code
Discovererエンド・ユーザーが必要な結果を表示できるようにするには、次のいずれかを行います。
前述のSQL文を含むカスタム・フォルダの作成(詳細は、「カスタム・フォルダの作成方法」を参照)
VIDEO_PRODUCTS.COUNTRY_CODEとVIDEO_SALES.COUNTRY_CODEの間およびVIDEO_PRODUCTS.PRODUCT_CODEとVIDEO_SALES.PRODUCT_CODEの間の結合条件が2つの結合(マルチアイテム結合)の作成(詳細は、「結合の作成方法」を参照)。
マルチアイテム結合を定義すると、次のことが可能になります。
Discoverer Administratorで複合フォルダを作成し、VIDEO_PRODUCTSからDESCRIPTIONを、VIDEO_SALESからVALUEを複合フォルダにドラッグできます(詳細は、「複合フォルダの作成方法」を参照)。
Discovererエンド・ユーザーがこの複合フォルダを使用できます。あるいは、VIDEO_PRODUCTSからDESCRIPTIONを、VIDEO_SALESからVALUEを選択することもできます。
注意: 各テーブルの複数の列を使用して行を識別する結合も、コンポジット結合キーと呼ばれます。
Discovererで3つ以上のフォルダを結合するには、各フォルダの間に別個の結合を定義する必要があります。
たとえば次のスキーマでは、2つの結合を使用して3つのテーブルを関連付けます。1つの結合がVIDEO_SALES_ORDERSテーブルをSALES_ORDER_LINE_ITEMSテーブルに関連付け、もう1つの結合がVIDEO_PRODUCTSテーブルをSALES_ORDER_LINE_ITEMSテーブルに関連付けます。
VIDEO_SALES_ORDERSテーブルの各販売注文は、特定の顧客に対するものです(販売IDで一意に識別されます)。SALES_ORDER_LINE_ITEMSテーブルに示されているように、各販売注文は1つ以上の行アイテムで構成され、それぞれの行アイテムが特定の製品に対して存在します。VIDEO_PRODUCTSテーブルの各製品には説明があります(製品は製品IDで一意に識別されます)。
Discovererエンド・ユーザーが、顧客の名前および顧客がこれまでに購入した製品の説明を次のように表示しようとする場合を想定します。
顧客名 | 製品の説明 |
---|---|
TURNER | TOY STORY |
TURNER | TOY STORY |
JONES | STARGATE |
JONES | POPCORN |
JONES | TRUE LIES |
SMITH | POPCORN |
SMITH | TOY STORY |
ADAMS | STARGATE |
つまり、VIDEO_SALES_ORDERS.CUST_NAMEおよびVIDEO_PRODUCTS.PROD_DESCを表示します。
次のSQL文により、必要な結果が得られます。
select cust_name, prod_desc from video_sales_orders, sales_order_line_items, video_products where video_sales_orders.sales_id=sales_order_line_items.sales_id and sales_order_line_items.prod_id=video_products.prod_id
Discovererエンド・ユーザーが必要な結果を表示できるようにするには、次のいずれかを行います。
前述のSQL文を含むカスタム・フォルダの作成(詳細は、「カスタム・フォルダの作成方法」を参照)
Discoverer Administratorの結合ウィザードを使用して、3つ以上のテーブルを結合する1つの結合を作成することはできません。そのかわり、2つの別個の結合を作成する必要があります。VIDEO_SALES_ORDERSとSALES_ORDER_LINE_ITEMSの間に1つ、SALES_ORDER_LINE_ITEMSとVIDEO_PRODUCTSの間に1つの結合を作成します(詳細は、「結合の作成方法」を参照)。
2つの別個の結合を定義すると、次のことが可能になります。
Discoverer Administratorで複合フォルダを作成して、VIDEO_SALES_ORDERSからCUST_NAMEを、SALES_ORDER_LINE_ITEMSから1つのアイテムを、VIDEO_PRODUCTSからPROD_DESCを、複合フォルダにドラッグできます。SALES_ORDER_LINE_ITEMSから選択したアイテムを削除して、希望する2つのアイテムが入ったフォルダを得ることができます(詳細は、「複合フォルダの作成方法」を参照)。
Discovererエンド・ユーザーがこの複合フォルダを使用できます。あるいは、VIDEO_SALES_ORDERSからCUST_NAMEを、SALES_ORDER_LINE_ITEMSから1つのアイテムを、VIDEO_PRODUCTSからPROD_DESCを選択することもできます。SALES_ORDER_LINE_ITEMSから選択したアイテムを削除して、希望する2列を表示するワークシートを得ることができます。
Discovererでは、非等価結合により、テーブルの列の間に直接の対応関係がない2つのフォルダを結合できます。非等価結合では、非等価結合演算子を使用する1つ以上の結合条件を使用して、2つのフォルダを関連付けます。
たとえば次のスキーマでは、2つのテーブルに一致する列がないため、非等価結合を使用してEMPテーブルとSALGRADEテーブルを結合します。
従業員の等級は給料に依存します。700から1200を受け取る従業員はグレード1、1201から1400を受け取る従業員はグレード2という具合です。
Discovererエンド・ユーザーが各従業員のグレードを次のように表示しようとする場合を想定します。
ENAME | グレード |
---|---|
KING | 5 |
BLAKE | 4 |
CLARK | 4 |
JONES | 4 |
MARTIN | 2 |
ALLEN | 3 |
TURNER | 3 |
JAMES | 1 |
つまり、EMP.ENAMEおよびSALGRADE.GRADEを表示します。
次のSQL文により、必要な結果が得られます。
select ename, grade from emp, salgrade where emp.sal>=salgrade.losal and emp.sal<=salgrade.hisal
Discovererエンド・ユーザーが必要な結果を表示できるようにするには、次のいずれかを行います。
前述のSQL文を含むカスタム・フォルダの作成(詳細は、「カスタム・フォルダの作成方法」を参照)
2つの非等価結合条件を持つ結合を作成します。EMP.SALとSALGRADE.LOSALの間に1つ、EMP.SALとSALGRADE.HISALの間に1つの結合を作成します(詳細は、「結合の作成方法」を参照)。
結合を定義すると、次のことが可能になります。
Discoverer Administratorで複合フォルダを作成し、EMPからSALを、SALGRADEからGRADEを複合フォルダにドラッグできます(詳細は、「複合フォルダの作成方法」を参照)。
Discovererエンド・ユーザーがこの複合フォルダを使用できます。あるいは、EMPからENAMEを、SALGRADEからGRADEを選択することもできます。
1対多結合は最も一般的なタイプの結合です。1対多結合では、マスター・フォルダの1行がディテール・フォルダの複数行に結合されます。
1対1結合は、結合で使用される両方のアイテムが主キーになる2つのフォルダ間の結合です。そのため、1つのフォルダの1行のみが、別のフォルダの1行のみと結合されます(あるいはどの行とも結合されません)。この場合、マスター・テーブルの各行はディテール・テーブルの1つの行にのみ対応可能であるため、実際のマスターとディテールは存在しません。1対1結合が有効な構成になる場合もあります。Discovererでは結合を1対1結合に指定できます。
複数のディテール・フォルダを持つマスター・フォルダにクエリーを行うことは可能です(1つを除くすべてのディテール・フォルダが1対1結合で結合されている場合)。3つ以上のディテール・フォルダがマスター・フォルダに1対多結合で結合されている場合(ファントラップ・スキーマ)は、マスター・フォルダの1行がディテール・フォルダの複数行に結合してデカルト演算になる可能性があります。Discovererでは、予期せぬ結果が返るのを防ぐため、ファントラップ・スキーマは解決されます。詳細は、「ファントラップの概要およびDiscovererでの処理方法」を参照してください。
多対多結合は、Discoverer (またはすべてのリレーショナル・システム)では直接サポートされていません。ただし、多対多結合はいつでも作りなおして複数の1対多結合に変更できます。ごくまれに、多対多結合が有効な構成になる場合があります。
複合フォルダを作成するときに、複数の結合を使用して2つのフォルダを結合することが必要になる場合があります。たとえば同じアイテムを含む複合フォルダを複数作成して、各複合フォルダで1つ以上の結合を使用する場合などです。これらの結合は、それぞれ異なる結合オプションを使用して定義できます。
次の表は、2つのフォルダ(例ではempとdept)を4つの異なる結合を使用して結合する方法を示しています。複合フォルダにアイテムを追加するときに、これらの結合を1つ以上選択できます。
複合フォルダ名 | マスター・フォルダ結合アイテム | 結合演算子 | ディテール・フォルダ結合アイテム | 結合に使用される結合オプション |
---|---|---|---|---|
Complex1 | emp.deptno | = |
dept.deptno | 選択されるオプションなし |
Complex2 | emp.deptno | = |
dept.deptno | ディテール外部キーにNULL値を使用可 |
Complex3 | emp.deptno | = |
dept.deptno | 1対1関係 |
Complex4 | emp.deptno | = |
dept.deptno | ディテール・フォルダでの外部結合 |
複合フォルダを作成し、複数の結合を有する2つのフォルダからアイテムをドラッグすると、Discoverer Administratorによって「結合の選択」ダイアログが表示され、使用する結合を1つまたは複数選択できます。
詳細は、「複合フォルダの作成方法」を参照してください。
Discoverer PlusまたはDiscoverer Desktopのユーザーが複数フォルダのアイテムを使用するワークシートを作成し、複数の結合を使用して結合された2つのフォルダからアイテムを選択すると、Discovererでは次のいずれかの処理が行われます。
利用可能な結合すべての使用
Discoverer PlusまたはDiscoverer Desktopで「複数の結合パスの検出の無効化」オプションが選択されているときの処理です。
1つ以上の結合を選択できる「フォルダの結合」ダイアログの表示
Discoverer PlusまたはDiscoverer Desktopで「複数の結合パスの検出の無効化」オプションが選択解除されているときの処理です。
詳細は、『Oracle Fusion Middleware Oracle Business Intelligence Discoverer Plusユーザーズ・ガイド』を参照してください。
状況によっては、マスター・フォルダおよびディテール・フォルダにクエリーを行うときに、常にDiscovererで結合を使用する場合があります。たとえば、次のような場合です。
クエリーで、マスター・フォルダとディテール・フォルダの両方からの値が返るようにする場合
クエリーで、マスター・フォルダに一致する値を持つ行のみがディテール・フォルダから返るようにする場合
結合の解決には比較的時間がかかるため、このようなクエリーでは結果が返るまでに比較的長い時間がかかる可能性があります。
他の状況では、Discovererでマスター・フォルダとディテール・フォルダの両方にクエリーを行う必要はありません。たとえば、次のような場合です。
ディテール・フォルダの値に対応する値が常にマスター・フォルダにあることがわかっている場合
値がマスター・フォルダに存在するかどうかにかかわらず、クエリーでディテール・フォルダの詳細な値がすべて返ることが常に望ましいとわかっている場合
Discovererでマスター・フォルダにクエリーを行う必要がないことを示す適切なオプションを設定すると、クエリーのパフォーマンスが向上します。ただし、マスター・テーブルにクエリーを行わないことにより、予期せぬ結果が返される可能性がありますので注意してください。マスター・フォルダを含める必要があるかどうかわからない場合は、「複合フォルダからのクエリー結果に結合が影響する例」を参照してください。
複合フォルダ内の2つ以上のフォルダを組み合せる場合(結合を使用)、Discovererでは不要な結合を検出して削除することにより、クエリーのパフォーマンスを向上できます(結合トリミング)。Discovererのレジストリ設定SQLJoinTrimが有効になっている(デフォルト値である1に設定されている)ときは、次の条件の両方が満たされた場合にクエリーから結合が削除されます。
結合を使用しないでリクエストされた行を返すことができる場合
結合に「ディテール・アイテム値が常にマスター・フォルダに存在」オプションが選択されている場合(詳細は、「複合フォルダからのクエリー結果に結合が影響する例」を参照)
Discovererのレジストリ設定の詳細は、第21章「Discovererのレジストリ設定」を参照してください。
「ディテール・アイテム値がマスター・フォルダに存在しない場合あり」オプションが選択されている結合を使用するクエリーを満たすために、Discovererでサマリー・フォルダが使用されることはありません(詳細は、「「結合の編集」ダイアログの 「オプション」タブ」を参照)。
次の例は、Discoverer Administratorを使用してEmp_and_Deptという複合フォルダが作成されていることを前提にしています。この複合フォルダは、DEPTテーブルおよびEMPテーブルに基づくもので、結合条件DEPT.DEPTNO=EMP.DEPTNOを使用します。
次の2つの使用例を考えてみます。
使用例1
使用例1では、EMPテーブルの従業員はDEPTテーブルの部門の1つに常に属する必要があります。
DEPTテーブルには部門10 (ACCOUNTS: 経理)、部門20 (RESEARCH: 研究)および部門30 (SALES: 営業)の行が含まれます。
EMPテーブルにはCLARK (部門10の従業員)、SMITH (部門20の従業員)およびALLEN (部門30の従業員)の行が含まれます。
この使用例で示されるスキーマでは、マスター・フォルダをクエリーに含めるかどうかにかかわらず、ENAMEに対するクエリーで同じ結果が生成されます。
使用例2
使用例2では、次に示すように、EMPテーブルの従業員がDEPTテーブルの部門に属する必要はありません。
DEPTテーブルには部門10 (ACCOUNTS: 経理)および部門20 (RESEARCH: 研究)の行が含まれます。
EMPテーブルにはCLARK (部門10の従業員)、SMITH (部門20の従業員)およびALLEN (すでに存在しない部門30の元従業員)の行が含まれます。
この使用例で示されるスキーマでは、マスター・フォルダをクエリーに含めるかどうかにより、ENAMEに対するクエリーで異なる結果が生成される可能性があります。
例1: マスター・フォルダの除外が常に可能
マスター・フォルダを含めても結果に違いがないときや、マスター・フォルダを含めても必要な結果が返らないときは、クエリーからマスター・フォルダを除外します。
注意: マスター・フォルダをクエリーの実行対象(複合フォルダのアイテムのみを使用するもの)から除外することは、Discoverer PlusまたはDiscoverer Desktopでマスター・フォルダとディテール・フォルダ間の結合を使用しないという意味です。クエリー・アイテムを複合フォルダから選択する場合(Discoverer PlusまたはDiscoverer Desktopでワークシートを作成する場合)、Discovererでは結合が使用されません。クエリー・アイテムはディテール・フォルダ(例ではEMP)からのみ返されます。
Discovererエンド・ユーザーが、Emp_and_Dept複合フォルダからENAMEアイテムを選択することにより、EMPテーブルの全従業員の名前を表示しようとする場合を想定します。
使用例1では、必要な結果は次のようになります。
ENAME |
---|
CLARK |
SMITH |
ALLEN |
マスター・フォルダをクエリーに含めても結果に違いはありません。クエリーによってすべての従業員が返されるためです。クエリーのパフォーマンスを向上させるには、「結合の編集」ダイアログの「オプション」タブで「ディテール・アイテムが常にマスター・フォルダに存在」オプションを選択して、Discovererでマスター・フォルダにクエリーを行わないように指定します。Discovererのレジストリ設定SQLJoinTrimも有効になっている場合、Discovererはマスター・フォルダにクエリーを行いません(詳細は、第21章「Discovererのレジストリ設定」を参照)。
使用例2では、必要な結果は次のようになります。
ENAME |
---|
CLARK |
SMITH |
ALLEN |
マスター・フォルダをクエリーに含めると、DEPTテーブルの部門番号に一致する部門番号を持つ従業員のみが返ります。しかしDiscovererエンド・ユーザーは、EMPテーブルの全従業員を表示しようとしています。EMPテーブルの全従業員が返されるようにするには、「結合の編集」ダイアログの「オプション」タブで「ディテール・アイテムが常にマスター・フォルダに存在」オプションを選択して、Discovererでマスター・フォルダにクエリーを行わないように指定します。Discovererのレジストリ設定SQLJoinTrimも有効になっている場合、Discovererはマスター・フォルダにクエリーを行いません(詳細は、第21章「Discovererのレジストリ設定」を参照)。
例2: マスター・フォルダの除外が可能な場合あり
マスター・フォルダの除外によってディテール・テーブルから必要な結果が返らなくなる場合は、クエリーにマスター・フォルダを含めます。
注意: マスター・フォルダをクエリーの実行対象(複合フォルダのアイテムのみを使用する)に含めることは、Discoverer PlusまたはDiscoverer Desktopでマスター・フォルダとディテール・フォルダ間の結合を使用するという意味です。クエリー・アイテムを複合フォルダから選択する場合(Discoverer PlusまたはDiscoverer Desktopでワークシートを作成する場合)、Discovererでは結合が使用されます。クエリー・アイテムはマスター・フォルダまたはディテール・フォルダのいずれか(例ではそれぞれDEPTまたはEMP)から返されます。
Discovererエンド・ユーザーが、Emp_and_Dept複合フォルダからENAMEアイテムを選択することにより、EMPテーブルの現在の従業員の名前を表示しようとする場合を想定します。DEPTテーブルにない部門に属している従業員はすべて現在の従業員ではないため、必要ではありません。
使用例1では、必要な結果は次のようになります。
ENAME |
---|
CLARK |
SMITH |
ALLEN |
マスター・フォルダをクエリーに含めても結果に違いはありません。すべての従業員が部門に属しているためです。クエリーのパフォーマンスを向上させるには、「結合の編集」ダイアログの「オプション」タブで「ディテール・アイテム値が常にマスター・フォルダに存在」オプションを選択して、Discovererでマスター・フォルダにクエリーを行わないように指定します。Discovererのレジストリ設定SQLJoinTrimも有効になっている場合、Discovererはマスター・フォルダにクエリーを行いません(詳細は、「Discovererのレジストリ設定」を参照)。
使用例2では、必要な結果は次のようになります。
ENAME |
---|
CLARK |
SMITH |
マスター・フォルダをクエリーに含めると、DEPTテーブルの部門番号に一致する部門番号を持つ従業員のみが返ります。これはDiscovererエンド・ユーザーが必要としている結果です。「結合の編集」ダイアログの「オプション」タブで「ディテール・アイテム値がマスター・フォルダに存在しない場合あり」オプションを選択することによって、常にマスター・フォルダにクエリーを行うように指定できます。
例3: マスター・フォルダの除外が常に不可能
マスター・フォルダとディテール・フォルダの両方からの情報が結果に含まれるようにする場合は、常にクエリーにマスター・フォルダを含めます。
注意: マスター・フォルダをクエリーの実行対象(複合フォルダのアイテムのみを使用する)に含めることは、Discoverer PlusまたはDiscoverer Desktopでマスター・フォルダとディテール・フォルダ間の結合を使用するという意味です。クエリー・アイテムを複合フォルダから選択する場合(Discoverer PlusまたはDiscoverer Desktopでワークシートを作成する場合)、Discovererでは結合が使用されます。クエリー・アイテムはマスター・フォルダまたはディテール・フォルダのどちらかあるいはその両方(例ではDEPTおよびEMP)から返されます。
Discovererエンド・ユーザーが、Emp_and_Dept複合フォルダからENAMEアイテムとDNAMEアイテムを選択することにより、従業員および各自が属する部門を表示しようとする場合を想定します。
使用例1では、必要な結果は次のようになります。
ENAME | DNAME |
---|---|
CLARK | ACCOUNTS |
SMITH | RESEARCH |
ALLEN | SALES |
部門の名前を返すには、クエリーにマスター・フォルダを含めることが不可欠です。Discovererでは、「結合の編集」ダイアログの「オプション」タブで「ディテール・アイテム値が常にマスター・フォルダに存在」オプションが選択されている場合でも、クエリーにマスター・フォルダが含まれます。
使用例2では、必要な結果は次のようになります。
ENAME | DNAME |
---|---|
CLARK | ACCOUNTS |
SMITH | RESEARCH |
部門の名前を返すには、クエリーにマスター・フォルダを含めることが不可欠です。Discovererでは、「結合の編集」ダイアログの「オプション」タブで「ディテール・アイテム値が常にマスター・フォルダに存在」オプションが選択されている場合でも、クエリーにマスター・フォルダが含まれます。
ALLENが(部門名のNULL値とともに)返されるのは、「結合の編集」ダイアログの「オプション」タブで「マスターでの外部結合」オプションを選択した場合のみです(詳細は、「外部結合」を参照)。
外部結合とは、結合されたテーブルに一致する行が存在しない場合に、テーブルから行が返るようにするためのSQL構文です。
次の使用例を考えてみます。
マスター・テーブルDEPTには部門10 (ACCOUNTS: 経理)、部門20 (RESEARCH: 研究)および部門40 (OPERATIONS: 業務)の行が含まれます。
ディテール・テーブルEMPにはCLARK (部門10)、SMITH (部門20)およびALLEN (すでに存在しない部門30の元従業員)の行が含まれます。
次の各例では、前述の図のスキーマを使用して、外部結合の場所によってクエリーから返る行が決まる様子を示します。
例1: マスター・テーブルでの外部結合
Discovererエンド・ユーザーが、従業員が現在部門に属していなくても全従業員の記録を表示しようとする場合を想定します。必要な結果は次のようになります。
DNAME | ENAME |
---|---|
ACCOUNTS | CLARK |
RESEARCH | SMITH |
<NULL> | ALLEN |
次のSQL文により、必要な結果が得られます。
select dname, ename from dept, emp where dept.deptno(+)=emp.deptno
外部結合がマスター・テーブルにあるときには、一致するマスター行が存在しない各ディテール行、および一致するすべてのディテール行とマスター行がデータベースから返されます。SQL文では、プラス(+)記号が外部結合を示します。
Discovererエンド・ユーザーが必要な結果を表示できるようにするには、次のいずれかを行います。
前述のSQL文を含むカスタム・フォルダの作成(詳細は、「カスタム・フォルダの作成方法」を参照)
DEPT.DEPTNOとEMP.DEPTNOの間に結合条件が1つの結合を作成し、「結合の編集」ダイアログの「オプション」タブで「ディテール・アイテムがマスター・フォルダに存在しない場合あり」オプションと「マスターでの外部結合」オプションの両方を選択します(結合の作成の詳細は、「結合の作成方法」を参照)。
結合を定義すると、次のことが可能になります。
Discoverer Administratorで複合フォルダを作成し、DEPTからDNAMEを、EMPからENAMEを複合フォルダにドラッグできます(詳細は、「複合フォルダの作成方法」を参照)。
Discovererエンド・ユーザーがこの複合フォルダを使用できます。あるいは、DEPTからDNAMEを、EMPからENAMEを選択することもできます。
例2: ディテール・テーブルでの外部結合
Discovererエンド・ユーザーが、部門に従業員がいなくてもすべての部門の記録を表示しようとする場合を想定します。必要な結果は次のようになります。
DNAME | ENAME |
---|---|
ACCOUNTS | CLARK |
RESEARCH | SMITH |
OPERATIONS | <NULL> |
次のSQL文により、必要な結果が得られます。
select dname, ename from dept, emp where dept.deptno=emp.deptno(+)
外部結合がディテール・テーブルにあるときには、一致するディテール行が存在しないマスター行、および一致するすべてのマスター行とディテール行がデータベースから返されます。SQL文では、プラス(+)記号が外部結合を示します。
Discovererエンド・ユーザーが必要な結果を表示できるようにするには、次のいずれかを行います。
前述のSQL文を含むカスタム・フォルダの作成(詳細は、「カスタム・フォルダの作成方法」を参照)
DEPT.DEPTNOとEMP.DEPTNOの間に結合条件が1つの結合を作成し、「結合の編集」ダイアログの「オプション」タブで「ディテールでの外部結合」を選択します(結合の作成の詳細は、「結合の作成方法」を参照)。
結合を定義すると、次のことが可能になります。
Discoverer Administratorで複合フォルダを作成し、DEPTからDNAMEを、EMPからENAMEを複合フォルダにドラッグできます(詳細は、「複合フォルダの作成方法」を参照)。
Discovererエンド・ユーザーがこの複合フォルダを使用できます。あるいは、DEPTからDNAMEを、EMPからENAMEを選択することもできます。
結合を作成し、エンド・ユーザーが、異なるフォルダからのアイテムを同じワークシートに含められるようにします。
結合を作成する手順は、次のとおりです。
「ワークエリア」の「データ」タブを表示し、ディテール・フォルダのアイテムに一致するマスター・フォルダのアイテムを選択します。
ヒント: マスター・フォルダとディテール・フォルダの区別の詳細は、「結合」を参照してください。
「挿入」→「結合」を選択すると、「結合ウィザード: ステップ1」ダイアログが表示されます。
「マスター・アイテム」フィールドにマスター・アイテムが表示されます。
ヒント: 「マスター・アイテム」フィールドのフォルダおよびアイテムを変更する場合は、ドロップダウン・リストの最後にある「追加アイテム」オプションを選択します。
「演算子」の下向き矢印をクリックし、ドロップダウン・リストから結合演算子を選択して結合のタイプを指定します。
「ディテール・アイテム」の下向き矢印をクリックして、「新規結合」ダイアログを表示します。
結合するフォルダとディテール・アイテムを選択します。
同じビジネスエリアのフォルダからディテール・アイテムを選択するか、開いている別のビジネスエリアのフォルダから選択できます。
マスター・アイテム、ディテール・アイテムおよび結合演算子を指定することにより、結合条件が作成されます。結合条件が1つのみの結合は、単一アイテム結合と呼ばれます(詳細は、「単一アイテム結合」を参照)。
ヒント: 「ディテール・アイテム」フィールドのフォルダおよびアイテムを変更する場合は、ドロップダウン・リストの最後にある「追加アイテム」オプションを選択します。
状況によっては、複数の結合条件を作成する必要があります(詳細は、「マルチアイテム結合」を参照)。
(オプション)マルチアイテム結合を作成する手順は、次のとおりです。
「追加」をクリックして、新規結合条件のための新しい行を表示します。
「マスター・アイテム」および「ディテール・アイテム」のドロップダウン・リストを使用して、すでに作成した結合条件と同じマスター・フォルダおよびディテール・フォルダから新しいアイテムのペアを選択します。
注意: すでに作成した結合条件に含まれていないフォルダからマスター・アイテムまたはディテール・アイテムを指定した場合は、すでに作成した結合条件が削除されます。
マスター・フォルダおよびディテール・フォルダの一致するアイテムをすべて指定するまで、新規結合条件を追加します。
「次へ」をクリックすると、「結合ウィザード: ステップ2」ダイアログが表示されます。
この結合に対する結合の詳細を次のように選択します。
ディテール・アイテム値が常にマスター・フォルダに存在(通常)
クエリーのパフォーマンスを向上させるには、このオプションを選択します(詳細は、「クエリー結果およびクエリーのパフォーマンスに結合が与える影響」を参照)。
ディテール・アイテム値がマスター・フォルダに存在しない場合あり
ディテール・フォルダのすべての値に対して一致する値がマスター・フォルダにあるかどうかわからない場合は、このオプションを選択します。このオプションを選択すると、予期せぬ結果が返される可能性があります(詳細は、「クエリー結果およびクエリーのパフォーマンスに結合が与える影響」を参照)。
(オプション)必要に応じてこの結合に次のオプションを選択します。
外部結合なし
外部結合を作成せずに、一致するすべてのマスター行およびディテール行を表示するには、このオプションを選択します。
ディテールでの外部結合
対応するディテール・アイテムのないマスター行、および一致するすべてのマスター行とディテール行を表示するには、このオプションを選択します。
マスターでの外部結合
対応するマスターのないディテール行、および一致するすべてのディテール行とマスター行を表示するには、このオプションを選択します。このチェック・ボックスを選択できるのは、「ディテール・アイテム値がマスター・フォルダに存在しない場合あり」オプションが選択されている場合のみです。
マスターとディテール間の1対1結合
マスター・テーブルとディテール・テーブルの間に1対1の関係があることを指定するには、このチェック・ボックスを選択します。
注意: 外部結合を作成する場合は、このチェック・ボックスの選択を解除します。
これらのオプションの詳細は、次の各項目を参照してください。
「終了」をクリックして変更内容を保存し、ダイアログを閉じます。
Discoverer Administratorによって2つのフォルダ間に結合が作成されます。ワークエリアの両方のフォルダの下に結合アイコンが表示されます。
注意
結合に関数またはリテラル(テキスト文字列、数値、日付など)を含めるには、使用する関数またはリテラルを含む計算定義アイテムを作成します。次に結合を作成し、これらのアイテムを結合で指定します。
次の方法のいずれかまたは両方を使用して、結合を表示または編集できます。
「結合の編集」ダイアログの「アイテム」タブおよび「結合の編集」ダイアログの「オプション」タブを使用すると、次のことができます。
結合アイテムの表示および編集
結合アイテムの追加および削除
結合の名前および説明の編集
結合オプションの表示および編集
「結合プロパティ」ダイアログを使用すると、次のことができます。
1つ以上の結合の結合プロパティの表示および編集
1つ以上の結合の依存オブジェクトの表示
次にこれらの方法を説明します。
「結合の編集」ダイアログを使用して結合を編集する方法
「結合の編集」ダイアログを使用して、結合を編集することが必要になる場合があります。
「結合の編集」ダイアログを使用して結合を編集する手順は、次のとおりです。
「ワークエリア」の「データ」タブで結合を選択し、「編集」→「編集」を選択して、「結合の編集」ダイアログの「アイテム」タブを表示します。
必要に応じて結合の名前、説明および結合条件を編集します。
「結合の編集」ダイアログの「オプション」タブを表示します。
必要に応じて結合オプションを編集します。
「OK」をクリックし、変更内容を保存してダイアログを閉じます。
「結合プロパティ」ダイアログを使用して結合プロパティを表示または編集する手順は、次のとおりです。
「結合プロパティ」ダイアログを使用して結合を編集する方法
「結合プロパティ」ダイアログを使用して、結合を編集することが必要になる場合があります。
「ワークエリア」の「データ」タブで結合を選択し、「編集」→「プロパティ」を選択して、「結合プロパティ」ダイアログを表示します。
ヒント: 同時に複数の結合を選択するには、[Ctrl]キーを押しながら別の結合をクリックします。選択された結合それぞれに共通するプロパティがすべて表示されます。プロパティの値が選択されたすべての結合に共通しない場合、「値」フィールドには何も表示されません。
必要に応じて変更を行います。
「OK」をクリックし、変更内容を保存して「結合プロパティ」ダイアログを閉じます。
もはや不要になった結合は削除できます。たとえば、以前に結合した2つのフォルダのアイテムが含まれるワークシートをエンド・ユーザーが作成しないようにする場合などです。
注意: 結合を削除すると、その結合を使用する他のEULオブジェクト(複合フォルダなど)も影響を受ける可能性があります。結合を削除する前に、EULをエクスポートすることをお薦めします。
結合を削除する手順は、次のとおりです。
「ワークエリア」の「データ」タブで結合を選択し、「編集」→「削除」を選択して、「削除の確認」ダイアログを表示します。
ヒント: 同時に複数の結合を選択するには、[Ctrl]キーを押しながら別の結合をクリックします。
(オプション)結合の削除によって影響を受ける可能性があるオブジェクトを確認する手順は、次のとおりです。
「影響」をクリックして、「影響」ダイアログを表示します。
「影響」ダイアログでは、結合の削除による影響を受ける可能性のある別のEULオブジェクトを確認できます。
注意: 「影響」ダイアログには、ファイル・システム(.dis
ファイル内)に保存されたワークブックに対する影響は表示されません。
(オプション)「影響」ダイアログの行を選択すると、現在の処理がEULオブジェクトに与える影響を示すテキストが、リストの一番下に表示されます。
結合の削除による影響を確認し終えたら、「閉じる」をクリックして「影響」ダイアログを閉じます。
選択した結合(1つまたは複数)を削除する場合は、「はい」をクリックします。
ファントラップとは、予期せぬ結果を返す可能性がある、結合されたデータベース・テーブルのグループです。最も一般的なファントラップは、マスター・テーブルが2つ以上のディテール・テーブルに個別に結合される場合に起こります。
このような構成は、関係としては正しくても、簡単なSQL文を使用してデータ・ポイントを集計するときに不正な結果を返す傾向にあります。
ただし、Discovererを使用してデータ・ポイントを集計する場合は、不正な結果が返されることはありません(ファントラップ検出を有効にした場合)。Discovererが生成するすべてのクエリーは、ファントラップの可能性がないかどうかが検査されます。ファントラップが検出されると、正しいレベルで集計が行われるように、通常Discovererはインライン・ビューを使用してクエリーをリライトします。各マスター/ディテール集計について1つのインライン・ビューが作成され、外部クエリーの結果が組み合されます。
簡単なSQL文で不正な結果が返される場合に、Discovererでは正しい結果が返される様子の例は、「ファントラップの例」を参照してください。
状況によっては、次のような解決不可能なファントラップ・スキーマが含まれるクエリーが検出されることもあります。
ディテール・フォルダで、マスターとは異なるキーが結合に使用されている場合
ディテール・フォルダ間に直接的な結合関係がある場合(あいまいな循環関係が生じます)
2つ以上のディテール・フォルダから、集計されない値が選択される場合
2つ以上のディテール・フォルダに、異なるマスター・フォルダへの個別の結合関係がある場合
このような場合、Discovererではクエリーが禁止され、エラー・メッセージが表示されます。
さらに、Discovererは合計できる列を制御します。マスター・フォルダとディテール・フォルダの両方のアイテムの値がワークシートに表示されている場合、Discovererではこれらの値が合計されません。そのかわりにNULL文字が表示され、不正な結果や予期せぬ結果が返るのを防ぎます。
Discovererでファントラップ検出を有効または無効にする場合の詳細は、『Oracle Fusion Middleware Oracle Business Intelligence Discoverer Plusユーザーズ・ガイド』を参照してください。
1つのマスター・フォルダ(ACCOUNT)と2つのディテール・フォルダ(SALESおよびBUDGET)が含まれる次のようなファントラップ・スキーマの例を考えてみます。
すべての会計に、各期間の複数の販売数値と複数の予算数値を持つことができます。
Discovererエンド・ユーザーが「会計ごとの売上合計と予算合計はいくらか」という質問に回答する場合を想定します。2つのディテール・テーブルの集計(SUM)は、同じマスター・テーブル(ACCOUNT)から得たものです。
この比較的単純なクエリーによって返される結果は次のとおりです。
Discovererを使用した場合は正しい結果が返る(ファントラップ検出を有効にした場合)
簡単なSQL文を使用した場合は不正な結果が返る
Discovererを使用した正しい結果の生成
「会計ごとの売上合計と予算合計はいくらか」という質問に回答するために、Discovererでは次の処理が行われます。
ACCOUNT (会計)の名前の選択(ACCOUNT.NAMEより)
SALES (販売)の合計の計算(SALES.SALESより)
BUDGET (予算)の合計の計算(BUDGET.BUDGETより)
Discovererでは、次のような正しい結果が返されます。
Account (会計) | Sales (販売) | Budget (予算) |
---|---|---|
Account 1 | 400 | 400 |
Account 2 | 130 | 100 |
Account 3 | 200 | 750 |
Account 4 | 300 | 200 |
Discovererでは正しいレベルで集計が行われるように、クエリーの検査、ファントラップの検出、クエリーのリライトが行われます。各マスター/ディテール集計について1回、インライン・ビューを使用してクエリーがリライトされ、外部クエリーの結果が組み合されます。
次の例は、正しい結果を返すためにDiscovererで使用されるSQLを示しています。
SELECT inACC as Name, SUM(inSalesSum) as SALES_SUM, ,SUM(inBudgetSum) as BUDGET__SUM, FROM
(SELECT masterID AS OutMasterIDSales, SUM(SalesDetailsSales) AS inSalesSum FROM (SELECT ID AS masterID, NAME AS masterName FROM ACCOUNT) INLineAccount, (SELECT ID AS SalesDetailId, ACCID AS SalesDetailAccID, SALES AS SalesDetailsSales FROM SALES )INLineSales
WHERE(masterID = SalesDetailAccID(+)) GROUP BY masterID) inner1, (SELECT masterID AS OutMasterIDBudget, SUM(BudgetDetailBudget) AS inBudgetSum, masterName AS inACC FROM
(SELECT ID AS masterID, NAME AS masterName FROM ACCOUNT) INLineAccount, (SELECT ID AS BudgetDetailId, ACCID AS BudgetDetailAccID, BUDGET AS BudgetDetailsSales FROM BUDGET )INLineBudget
WHERE(masterID = BudgetDetailAccID(+)) GROUP BY masterName, masterID ) inner2 WHERE ((OutMasterIDBudget = OutMasterIDSales)) GROUP BY inACC
各販売と各予算が個別に(各マスター/ディテール集計について1回)合計され、マスター・キー(1つまたは複数)に基づいて結合と組み合されるため、この結果は正しくなります。
簡単なSQL文を使用した不正な結果の生成
「会計ごとの売上合計と予算合計はいくらか」という質問に回答するために、次のような簡単なSQL文の使用が考えられます。
SELECT Account.Name, SUM(sales), SUM(budget) FROM Account, Sales, Budget Where Account.id=Sales.accid AND Account.id=Budget.accid GROUP BY Account.Name
このような簡単なSQL文では、次のような不正な結果が返ります。
Account (会計) | Sales (販売) | Budget (予算) |
---|---|---|
Account 1 | 800 | 1200 |
Account 2 | 130 | 200 |
Account 3 | 600 | 750 |
Account 4 | 600 | 600 |
この結果は関係上は正しいのですが、あきらかに間違っています。たとえば、この結果ではAccount 1の売上合計が800となっていますが、SALESテーブルによればAccount 1の売上合計は400 (100+100+200)です。
このような不正な結果の原因は、各テーブルが最初に一時的なテーブルに結合されてから集計が行われる単一クエリーにあります。しかしこの処理では、集計が複数回(不正に)行われることになります。
Discovererでは、複合フォルダ内でのファントラップ結合設定に関する警告が、無効な結合設定が存在することを示すメッセージとして表示されます。Discovererで複合ファイルに対して正しい結果が確実に返るようにするには、ディテール・アイテムの「計算式」プロパティを編集して、集計計算式を明示的に指定します。
たとえば次のように、複合フォルダの「Sales」アイテムの「計算式」プロパティを、Sales Fact.SalesからSUM(Sales Facts.Sales)に設定します。
Discovererでは、異なるデータ型(VARCHAR、NUMBERまたはDATEなど)のアイテム間の結合は禁止されています。ただし、以前のDiscovererリリースからアップグレードしている場合、異なるデータ型間に既存の結合が存在することがあります。データ型が異なる2つのアイテム間の結合が存在する場合、クエリーは実行されますが、エラー・メッセージが表示されて、クエリーは完了しません。また、データ型が異なるアイテムを含む結合の編集を試みると、エラー・メッセージが表示されます。
次の方法で、データ型が異なる2つのアイテム間の結合を作成できます。
データ型が異なる1つ目のアイテムを基に新規アイテムを作成し、変換関数(TO_CHAR()、TO_DATE()、TO_NUMBER()など)を使用して、新規アイテムのデータ型を2つ目のアイテムに合わせます。
新規アイテムと2つ目のアイテムの間に結合を作成します。
詳細は、「データ型の異なる2つのアイテム間に結合を作成する方法の例」を参照してください。
この例では、次のアイテムを使用して、「Calendar Date」フォルダと「Store and Sales Detail」フォルダの間に結合を作成します。
「Calendar Date」フォルダの「Day of Week」アイテム
「Store and Sales Detail」フォルダの「Transaction Date」アイテム
これら2つのアイテムは、次のようにデータ型が異なります。
「Day of Week」アイテムのデータ型はVARCHAR
「Transaction Date」アイテムのデータ型はDATE
これら2つのアイテムを使用して2つのフォルダ間に結合を作成するには、次の手順を実行する必要があります。
「Day of Week」アイテムをVARCHARからDATEデータ型に変換する新規アイテムを作成する最初の手順は、次のとおりです。
「Video Store Tutorial」ビジネスエリアから「Calendar Date」フォルダを選択します。
「挿入」→「アイテム」を選択して、「新規アイテム」ダイアログを表示します。
「アイテム名」フィールドに「New Day of Week
」と入力します。
「関数」オプションを選択して、関数フォルダを表示します。
「変換」フォルダの隣のプラス記号(+)をクリックして、変換関数を表示します。
TO_DATE関数を選択し、「貼付け >>」をクリックして、TO_DATE関数を新規アイテムの「計算」フィールドに貼り付けます。
「計算」フィールドのTO_DATE関数のカッコ内のテキストを次のテキストで置き換えます。
Day of Week,Day
「計算」フィールドに次のテキストが表示されます。
TO_DATE(Day of Week,Day)
「OK」をクリックして、新規アイテムを作成します。
「Day of Week」(VARCHAR)アイテムを基に、DATEデータ型に変換された新規アイテムが作成されました。
正しいデータ型の新規計算定義アイテムを作成したら、次の手順では新規アイテムを「Store and Sales Details」フォルダの「Transaction Date」アイテムに結合します。
「Calendar Date」フォルダの「New Day of Week」アイテムを選択します。
「挿入」→「結合」を選択すると、「結合ウィザード: ステップ1」ダイアログが表示されます。
「ディテール・アイテム」ドロップダウン・リストをクリックして、「新規結合」ダイアログを表示します。
「新規結合」ダイアログでは、新規結合のディテール・フォルダおよびアイテムを選択できます。
「Store and Sales Details」フォルダの隣のプラス記号(+)をクリックして、フォルダのアイテムを展開します。
「Transaction Date」アイテムを選択し、「OK」をクリックして「新規結合」ダイアログを閉じます。
「次へ」をクリックすると、「結合ウィザード: ステップ2」ダイアログが表示されます。
「終了」をクリックしてデフォルトの結合オプションを受け入れ、「結合ウィザード: ステップ2」ダイアログを閉じます。
「New Day of Week」アイテムと「Transaction Date」アイテムのデータ型が同じなので、Discovererではこれら2つのアイテムを使用して、「Calendar Date」フォルダを「Store and Sales Details」フォルダに結合できます。