複数の表にあるデータの結合

表示する情報が 1 つの表にはないことがあります。 そのような場合には、結果表の行を形成するのに、 別々の表からそれぞれ必要な列の値を取り出したい場合があります。

このタスクについて

SELECT ステートメントを使用すれば、複数の表から列の値を取り出し、 それらを単一の行に結合することができます。

通常、結合操作では、結合条件に 基づいて、ある表の行を別の表の行とマッチングします。 Db2 次の種類の結合をサポートしています:インナー・ジョイン、レフト・アウター・ジョイン、ライト・アウター・ジョイン、フル・アウター・ジョイン。 結合は、照会の FROM 文節で指定できます。

Db2 内部結合、外部結合(左外部結合、右外部結合、完全外部結合を含む)およびクロス結合をサポートします。

内部結合
内部結合の結果はテーブルのクロスプロダクトですが、結合条件が真である行のみが残ります。 T1 INNER JOIN T2 の結果は、それらのペアとなった行から構成されます。 結合演算子を指定しないと、INNER がデフォルトになります。 LEFT OUTER JOIN または RIGHT OUTER JOIN を実行する順序によっては、 結果が違ってくることがあります。 詳細は、「内部結合」 を参照してください。
外部結合
外部結合の結果には、内部結合によって生成された行に加え、左外部結合、完全外部結合、右外部結合、または完全外部結合が使用されたかどうかによって、不足している行が含まれます。 詳細は、「外部結合」 を参照してください。
左外部結合
左外部結合の結果には、内部結合で欠落していた左テーブルの行が含まれます。 T1 LEFT OUTER JOIN T2 の結果は、それらのペアとなった行から構成され、 T1 のペアになっていない各行については、その行と T2 のヌル行の結合となります。 T2 から導き出されたすべての列では、NULL 値が許可されます。 詳細は、「左外部結合」 を参照してください。
右外部結合
右外部結合の結果には、内部結合で欠落していた右テーブルの行が含まれます。 T1 RIGHT OUTER JOIN T2 の結果は、それらのペアとなった行から構成され、 T2 のペアになっていない各行については、その行と T1 のヌル行の結合となります。 T1 から導き出されたすべての列では、NULL 値が許可されます。 詳細は 「右外部結合」 を参照してください。
全外部結合
完全な外部結合の結果には、内部結合で欠落していた両テーブルの行が含まれます。 T1 FULL OUTER JOIN T2 の結果は、それらのペアの行から構成され、 T1 の各ペアになっていない行については、その行と T2 のnull行の結合、 T2 の各ペアになっていない行については、その行と T1 のnull行の結合となります。 結果表のすべての列で NULL 値が許可されます。 詳細は、「完全外部結合」 を参照してください。
クロス結合
クロスジョインの結果には、テーブルのクロスプロダクトが含まれます。左テーブルの各行が右テーブルの各行すべてと結合されます。 クロスジョインは、 直積とも呼ばれます。 T1 CROSS JOIN T2 の結果は、 T1 の各行と T2 の各行が組み合わさったものです。 結合基準を指定するための WHERE 文節を使用せずに、FROM 文節でコンマによって区切った 2 つの表をリストする方法で、CROSS JOIN 構文を使用せずにクロス結合を指定することもできます。

結合における、ネストされた表の式およびユーザー定義の表関数
結合のオペランドは、単一の表の名前よりも複雑な場合があります。 次の項目のいずれかを結合オペランドとして指定できます。
ネストされた表の式
括弧で囲み、その後に相関名を続けた全選択。 相関名を使用すると、その式の結果を参照できます。

ネストされた表の式を結合で使用すると、結合に使用する一時表を作成する場合に役立ちます。 ネストされた表の式は、どちら側の一致しない行を組み込むかに応じて、結合の左右どちらのオペランドとしても指定できます。

ユーザー定義表関数
表を戻すユーザー定義関数。

ネストされた表の式を結合で使用すると、表の値を別の表に結合する前に、値に対して何らかの操作を実行する場合に役立ちます。

例: 相関参照の使用
次の SELECT ステートメントで、ネストされた表の式に使用される相関名は CHEAP_PARTS です。 この相関名を使用して、式から戻される列を参照できます。 この場合、これらの相関参照は CHEAP_PARTS.PROD# および CHEAP_PARTS.PRODUCT です。
SELECT CHEAP_PARTS.PROD#, CHEAP_PARTS.PRODUCT
   FROM (SELECT PROD#, PRODUCT
            FROM PRODUCTS
            WHERE PRICE < 10) AS CHEAP_PARTS;
結果表は、以下の出力のようになります。
PROD#       PRODUCT
=====       ===========
505         SCREWDRIVER
30          RELAY
CHEAP_PARTS を定義する表式の中で相関参照が発生しないため、これらの相関参照は有効です。 相関参照は、副照会の階層内の高レベルでの表指定を起点とします。
例:ネストされたテーブル式を結合の右オペランドとして使います。
次の照会には、PROJECTS 表との左外部結合の右オペランドとして全選択 (太字) が含まれます。 相関名は TEMP です。 この例では、PROJECTS 表からの一致しない行が組み込まれ、ネストされた表の式からの一致しない行は組み込まれません。
SELECT PROJECT, COALESCE(PROJECTS.PROD#, PRODNUM) AS PRODNUM,
       PRODUCT, PART, UNITS
FROM PROJECTS LEFT JOIN
      (SELECT PART,
          COALESCE(PARTS.PROD#, PRODUCTS.PROD#) AS PRODNUM,
          PRODUCTS.PRODUCT
       FROM PARTS FULL OUTER JOIN PRODUCTS
             ON PARTS.PROD# = PRODUCTS.PROD#) AS TEMP
   ON PROJECTS.PROD# = PRODNUM;
例:ネストされたテーブル式を結合の左側のオペランドとして使います。
次の照会には、PRODUCTS 表との左外部結合の左オペランドとして全選択が含まれます。 相関名は PARTX です。 この例では、ネストされた表の式からの一致しない行が組み込まれ、PRODUCTS 表からの一致しない行は組み込まれません。
SELECT PART, SUPPLIER, PRODNUM, PRODUCT
  FROM (SELECT PART, PROD# AS PRODNUM, SUPPLIER
           FROM PARTS
           WHERE PROD# < '200') AS PARTX
        LEFT OUTER JOIN PRODUCTS
           ON PRODNUM = PROD#;
結果表は、以下の出力のようになります。
PART        SUPPLIER         PRODNUM     PRODUCT
=======     ============     =======     ==========
WIRE        ACWF             10          GENERATOR
MAGNETS     BATEMAN          10          GENERATOR
OIL         WESTERN_CHEM     160         ----------
PROD# は文字フィールドであるため、 Db2 は文字を比べ、結果行のセットを決定します。 したがって、文字「30」は「200」より大きいため、PROD# が「30」に等しい行は、結果には現われません。
例: 結合のオペランドとして表関数を使用する
例えば、CVTPRICE は、PRODUCTS 表の価格を指定した通貨に変換し、この通貨単位での価格を入れた PRODUCTS 表を返す表関数であるとします。 次の照会に類似した照会を実行すると、 パーツの表、供給業者表、および選択した通貨の製品価格表を得ることができます。
SELECT PART, SUPPLIER, PARTS.PROD#, Z.PRODUCT, Z.PRICE
   FROM PARTS, TABLE(CVTPRICE(:CURRENCY)) AS Z
   WHERE PARTS.PROD# = Z.PROD#;
結合における表指定の相関参照
ネストされた表の式の結果を参照するには、相関名を使用します。 式の相関名を指定した後でこの相関名を参照する場合、その参照は相関参照 と呼ばれます。
ネストされた表の式の中に、または表関数への引数として、 相関参照を含めることができます。 この場合の両方に適用される基本的な規則は、 相関参照は、副照会の階層内の高レベルでの表指定を起点とする 必要があるということです。 表の指定が相関参照の左にあり、また相関参照が次の文節のいずれかにあれば、 相関参照と、これが参照する表の指定を同じ FROM 文節で使用することもできます。
  • キーワード TABLE が前にあるネストされた表の式
  • 表関数の引数
相関参照の詳細については、 参照の相関名を参照してください。

同じ FROM 文節で、他の表への相関参照を含む表関数または表式は、 全外部結合または右外部結合に参加できません。 次の例で、表の指定における相関参照の有効な使用方法を示します。

以下の例で、相関参照 T.C2 が有効な理由は、その相関参照が参照する表指定 T がその左にあるためです。

SELECT T.C1, Z.C5
  FROM T, TABLE(TF3(T.C2)) AS Z
  WHERE T.C3 = Z.C4;

逆の順序で結合を指定し、T が TABLE(TF3(T.C2)) の後にある場合は、T.C2 は無効です。

この例で、相関参照 D.DEPTNO が有効な理由は、これが現れるネストされた表の式の前に TABLE があり、表指定 D が FROM 節のネストされた表の式の左に現れるためです。

SELECT D.DEPTNO, D.DEPTNAME,
  EMPINFO.AVGSAL, EMPINFO.EMPCOUNT
  FROM DEPT D,
    TABLE(SELECT AVG(E.SALARY) AS AVGSAL,
            COUNT(*) AS EMPCOUNT
            FROM EMP E
            WHERE E.WORKDEPT=D.DEPTNO) AS EMPINFO;

キーワード TABLE を除去すると、D.DEPTNO は無効になります。