内部結合

内部結合は、表間の関連する列またはフィールドに適用される結合述語に基づいて、2つ以上の表の行を結合することによって新しい行を生成する操作です。結果セットには、結合述語を満たす結合された行のみが含まれています。

構文

結合する表は、SELECT文のFROM句でカンマで区切って指定します。
innerjoin_from_clause ::= FROM innerjoin_tables (COMMA innerjoin_tables)* (COMMA unnest_syntax)*
innerjoin_table_clause ::= single_from_table|aliased_table_name|left_outer_join_tables|nested_tables
この構文の様々な要素の詳細は、FROM句を参照してください。この構文は、個々の表を結合するだけでなく、NESTED TABLES句の結果(または左外部結合のリスト)を個々の表または別のNESTED TABLES句の結果(または左外部結合のリスト)とも結合できることを意味します。

セマンティクス

FROM句は、使用される表を指定します。結合で参加している表の名前の後に表の別名を付けることができます。

2つの表(AとB)の内部結合の実行について考えてみましょう。表AにはN個の行とn個の列があり、表BにはM個の行とm個の列があります。概念的には、表Aのすべての行が表Bのすべての行と結合されます。結果の表ABは、N * M行およびn + m列を持つことになります。

単純な例を使用して、内部結合の仕組みを理解しましょう。次の例で、表Aには3つの行と3つの列があり、CA1が主キー/シャード・キーです。その子表Bには2つの行と3つの列があり、CB1が主キーです。

表6-10 表A

CA1 CA2 CA3
RA11 RA12 RA13
RA21 RA22 RA23
RA31 RA32 RA33

表6-11 表B

(CA1) CB1 CB2 CB3
RA11 RB11 RB12 RB13
RA21 RB21 RB22 RB23
列(CA1)は、表Aから継承されたシャード・キーです。

表6-12 結合された表AB (表Aのすべての行が表Bのすべての行と結合されます)

CA1 CA2 CA3 (CA1) CB1 CB2 CB3
RA11 RA12 RA13 RA11 RB11 RB12 RB13
RA11 RA12 RA13 RA21 RB21 RB22 RB23
RA21 RA22 RA23 RA11 RB11 RB12 RB13
RA21 RA22 RA23 RA21 RB21 RB22 RB23
RA31 RA32 RA33 RA11 RB11 RB12 RB13
RA31 RA32 RA33 RA21 RB21 RB22 RB23
次に、WHERE句がこの結合表に適用されます。WHERE句には、表のレコードが結合される列またはフィールドを指定する結合述語が含まれています。
内部結合の場合、WHERE句には、使用する表のすべてのシャード・キーに対する等価述語が含まれている必要があります。このため、この述語を適用した後、内部結合の後の最終的な表は次のようになります:

表6-13 内部結合(シャード・キー等価述語に基づく)後の結果

CA1 CA2 CA3 (CA1) CB1 CB2 CB3
RA11 RA12 RA13 RA11 RB11 RB12 RB13
RA21 RA22 RA23 RA21 RB21 RB22 RB23
WHERE句に他の結合述語がある場合は、その述語が適用されます。

A、B、C、Dなどの2つ以上の表を結合する場合、FROM句が最初に表AおよびBに適用され、表ABが生成されます。同様に、FROM句が表ABおよびCに適用され、表ABCが生成されます。最後に、FROM句がABCとDに適用され、表ABCDが生成されます。WHERE句の結合述語が、この結合された表ABCDに適用されます。

内部結合の実行中に、次のことが適用されます:
  • 同じ表階層内の表間の結合のみが許可されます。
  • 祖先と子孫の関係にある表と、祖先と子孫の関係にない表の結合がサポートされます。
  • 結合述語には、結合される表のすべてのシャード・キー列間の等価述語を含める必要があります。つまり、結合される表のペアについて、一方の表の行がもう一方の表の行と一致するのは、両方の表のシャード・キー列が同じ値である場合のみです。シャード・キーの詳細は、CREATE TABLEを参照してください。DESCRIBE TABLE文を使用すると、シャード・キーを識別できます。
  • WHERE句の残りの述語は、これらの一致する行に適用されます。

内部結合の結果セットの列の順序:

SELECT句で「*」を使用すると、表内のすべてのフィールドが返されます。結果セット内のフィールドの順序は、FROM句で表を指定する順序によって異なります。SELECT句でフィールドのリストを指定した場合、フィールドの順序はSELECT句で指定された順序になります。