内部結合

内部結合 は、2 つの表を結合する方式の 1 つで、一方の表に他方の表の行と一致しない列があればその行を破棄します。 マッチングは結合条件に基づいて行われます。

内部結合を要求するには、結合したい表を FROM 文節で指定し、WHERE 文節 または ON 文節で結合条件を指定して、SELECT ステートメントを 実行します。 結合条件は、副照会を含まない 単純検索条件または複合検索条件のいずれでも構いません。

最も単純なタイプの内部結合では、 結合条件は column1=column2 です。

インナー・ジョインの例

この例では、PARTSとPRODUCTSテーブルに以下の行が含まれていると仮定します

          PARTS table                             PRODUCTS table
PART      PROD#   SUPPLIER              PROD#     PRODUCT        PRICE
=======   =====   ============          =====     ===========    =====
WIRE      10      ACWF                  505       SCREWDRIVER    3.70
OIL       160     WESTERN_CHEM          30        RELAY          7.55
MAGNETS   10      BATEMAN               205       SAW            18.90
PLASTIC   30      PLASTIK_CORP          10        GENERATOR      45.75
BLADES    205     ACE_STEEL

PROD#列でPARTSとPRODUCTSテーブルを結合し、サプライヤーとそれらの部品を使用する製品を含む部品のテーブルを作成するには、以下のSELECT文のいずれかを使用します

SELECT PART, SUPPLIER, PARTS.PROD#, PRODUCT
  FROM PARTS, PRODUCTS
  WHERE PARTS.PROD# = PRODUCTS.PROD#;
SELECT PART, SUPPLIER, PARTS.PROD#, PRODUCT
  FROM PARTS INNER JOIN PRODUCTS
    ON PARTS.PROD# = PRODUCTS.PROD#;

結果表は、以下の出力のようになります。

PART      SUPPLIER        PROD#   PRODUCT
=======   ============    =====   =========
WIRE      ACWF            10      GENERATOR
MAGNETS   BATEMAN         10      GENERATOR
PLASTIC   PLASTIK_CORP    30      RELAY
BLADES    ACE_STEEL       205     SAW

この例に関して、以下の 3 つの点に注意してください。

  • パーツ表にあるパーツ (OIL) には製品 (#160) がありますが、製品表には製品 (#160) はありません。 製品 (SCREWDRIVER, #505) には、パーツ表にリストされたパーツがありません。 したがって、OIL も SCREWDRIVER も結合後の結果表には現われません。

    これに対して、外部結合 は、結合された列の値が一致しなくても、その列を含む行を結果に含めます。

  • この結合が内部結合 (外部結合ではなく) であることを明示的に指定でき ます。 FROM 文節で明示的に表を結合するときは、FROM 文節でコンマではなく INNER JOIN を使用し 、かつ、ON を使用して結合条件 (WHERE ではなく) を指定します。
  • 最初の照会形式で WHERE 文節を指定しないと、FROM 文節で指定した表に対して可能な、行の 組み合わせのすべてが結果表に入ります。 次のステートメントの場合のように、2 番目の照会形式で、 常に真となるような結合条件を指定した場合も、同じ結果が得られます。
    SELECT PART, SUPPLIER, PARTS.PROD#, PRODUCT
      FROM PARTS INNER JOIN PRODUCTS
        ON 1=1;
    WHERE 文節を省略するか、常に真である結合条件を指定するかに関係なく、結果表に入る行の数は、それぞれの表の行数を乗算した積になります。

より複雑な結合条件を指定し、異なる結果のセットを入手することができます。 例えば、パーツ、供給業者、製品番号、および製品の表から、A の文字 で始まる供給業者を除くには、次の照会のような照会を作成します。

SELECT PART, SUPPLIER, PARTS.PROD#, PRODUCT
  FROM PARTS INNER JOIN PRODUCTS
    ON PARTS.PROD# = PRODUCTS.PROD#
    AND SUPPLIER NOT LIKE 'A%';

問い合わせの結果は、Aで始まるサプライヤを持たないすべての行です。 結果表は、以下の出力のようになります。

PART        SUPPLIER       PROD#     PRODUCT
=======     ============   =====     ==========
MAGNETS     BATEMAN        10        GENERATOR
PLASTIC     PLASTIK_CORP   30        RELAY

内部結合を使用して表をその表自体に結合する例

表を自身に結合すると、行間の関係を知るために便利です。 次の例では、PROJ 表からの主要プロジェクトと、これらの主要プロジェクトに含まれるプロジェクトのリストを戻します。

この例では、 A はテーブル DSN8C10. PROJ の最初のインスタンスを示し、 B はこのテーブルの 2 番目のインスタンスを示します。 結合条件は、表 DSN8C10. PROJ A の列 PROJNO の値が、表 DSN8C10. PROJ B の列 MAJPROJ の値と等しくなければならないというものです。

次の SQL ステートメントは、テーブル DSN8C10. PROJ をそれ自体に結合し、各主要プロジェクトの番号と名前に続いて、その一部であるプロジェクトの番号と名前を返します。

SELECT A.PROJNO, A.PROJNAME, B.PROJNO, B.PROJNAME
  FROM DSN8C10.PROJ A, DSN8C10.PROJ B
  WHERE A.PROJNO = B.MAJPROJ;

結果表は、以下の出力のようになります。

PROJNO  PROJNAME                  PROJNO   PROJNAME
======  ========================  =======  ========================
AD3100  ADMIN SERVICES            AD3110   GENERAL AD SYSTEMS
AD3110  GENERAL AD SYSTEMS        AD3111   PAYROLL PROGRAMMING
AD3110  GENERAL AD SYSTEMS        AD3112   PERSONNEL PROGRAMMG
⋮
OP2010  SYSTEMS SUPPORT           OP2013   DB/DC SUPPORT

この例では、FROM 文節のコンマは暗黙的に内部結合 を指定し、INNER JOIN キーワードが使用された場合と同様の働きをします。 内部結合を意味するコンマを使用した場合、 結合条件の指定は WHERE 文節で行わなければなりません。 INNER JOIN キーワードを使用した場合は、 結合条件の指定は ON 文節で行わなければなりません。