2 つのテーブルのデータを基にして、テーブルを作成します。
Synopsis
[INNER | LEFT [OUTER] | RIGHT [OUTER] ] JOIN
      table [[AS] identifier] ON condition-expression

CROSS JOIN table [[AS] identifier]

NATURAL [INNER | LEFT [OUTER] | RIGHT [OUTER] ] JOIN 
      table [[AS] identifier]

[INNER | LEFT [OUTER] | RIGHT [OUTER] ] JOIN
      table [[AS] identifier] USING (identifier-commalist)
概要
JOIN は、2 つのテーブルを組み合わせて、オプションの制限条件に従う結合テーブルを作成します。新規のテーブルのすべての行は、制限された条件を満たしている必要があります。JOIN は、テーブルのデータを別のテーブルのデータと結合する手段を提供し、レポートやクエリの定義に頻繁に使用されます。
JOIN 式は SELECT 文で FROM 節の一部として使用されます。FROM 節の JOIN 式には複数の JOIN を含めることができます。キーワードの %INORDER および %FULL を FROM キーワードの直後に使用して、複数の JOIN を最適化することができます。これらのキーワードの詳細は、"FROM" 節を参照してください。
JOIN の説明
Caché は、JOIN の複数の異なる構文形式をサポートします。しかし、これら複数の公式化は以下の 4 つの結合のタイプに参照します。
ANSI 結合構文 同等の構文
CROSS JOIN FROM 節での table1,table2 という記号表現 (コンマで区切られたテーブルのリスト) と同じです。
INNER JOIN JOIN と同じ。記号表現 : "=" (WHERE 節内)
LEFT OUTER JOIN LEFT JOIN と同じ。記号表現 : "=*" (WHERE 節内)。これはお勧めしません。新しいコードでは使用しないでください。
RIGHT OUTER JOIN RIGHT JOIN と同じ。記号表現 : "*=" (WHERE 節内)。これはお勧めしません。新しいコードでは使用しないでください。
CROSS JOIN は最初のテーブルの行すべてを次のテーブルの行すべてと交差させる結合です。結果は、多くの重複データを持つ、大きな、論理的に総合的なテーブル (デカルト積) になります。通常、この結合はコンマで区切られたテーブルのリストを FROM 節内で指定し、その後 WHERE 節を使用して制限条件を指定することによって実行されます。
INNER JOIN は、最初のテーブルの行を次のテーブルの行とリンクする結合です。最初のテーブルの行で、次のテーブル内に対応する行が見つからないものはリンクしません。結果は、各フィールドが一意のデータを含む、小さなテーブルになります。
LEFT OUTER JOIN と RIGHT OUTER JOIN は機能上ほとんどの点で同一であり (構文が逆)、そのため、集合的に単方向外部結合とみなされる場合が多くあります。単方向外部結合は、最初のテーブル (ソース・テーブル) のすべての行を次のテーブルの行とリンクさせる結合です。最初のテーブルの行に一致する行が次のテーブルで見つからない場合でも、リンクは行われます。結果はテーブルで、最初のテーブル (ソース・テーブル) 内にあるフィールドの中には、NULL データと組み合わされるものもあります。
単方向外部結合を指定する場合、FROM 節のテーブルを指名する順番が非常に重要です。LEFT OUTER JOIN では、最初に指定するテーブルが結合のソース・テーブルです。RIGHT OUTER JOIN では、2 つ目に指定するテーブルが結合のソース・テーブルです。この 2 つのタイプの単方向外部結合にはわずかに異なる制限があります。
NATURAL JOIN
NATURAL JOIN は、INNER JOIN、LEFT OUTER JOIN、または RIGHT OUTER JOIN の前に NATURAL キーワードを付けたものです。JOIN の前に NATURAL という語を付けると、2 つのテーブルで同じ名前を持つすべての列において結合が実行されます。NATURAL JOIN では、同じ名前を持つすべての列で自動的に等値条件が実行されるため、ON 節や USING 節を指定することはできません。
NATURAL JOIN のどちらのオペランドでも、単純なベース・テーブル参照 (ビューやサブクエリではない) のみがサポートされます。
NATURAL JOIN は、JOIN 式内の最初の JOIN としてのみ指定することができます。
ON 節
INNER JOIN、LEFT OUTER JOIN、または RIGHT OUTER JOIN には ON 節を指定できます。ON 節のある JOIN のどちらのオペランドでも、テーブル、ビュー、およびサブクエリがサポートされます (以下で説明する単方向外部結合の制限事項に従います)。ON 節のある JOIN は、JOIN 式内のどこでも指定することができます。ON 節のある JOIN に NATURAL キーワードを接頭語として付けたり、USING 節を指定することはできません。
INNER JOIN では、ON 節の条件式に制限はなく、どのような式も有効です。これには、より大きい (>) やより小さい (<) などの算術演算子や、OR や NOT などの論理演算子も含まれます。また、括弧を使用して INNER JOIN の条件式をグループ化したり、構文的に意味のあるものにすることもできます。
LEFT OUTER JOIN と RIGHT OUTER JOIN には、以下に説明するさまざまな制限事項が適用されます。
USING 節
INNER JOIN、LEFT OUTER JOIN、または RIGHT OUTER JOIN には USING 節を指定できます。USING 節のある JOIN のどちらのオペランドでも、単純なベース・テーブル参照 (ビューやサブクエリではない) のみがサポートされます。USING 節のある JOIN は、JOIN 式内の最初の JOIN としてのみ指定できます。USING 節のある JOIN に NATURAL キーワードを接頭語として付けたり、ON 節を指定することはできません。
USING 節では、1 つ以上の列名をコンマで区切ったリストを括弧で囲みます。重複する列名は無視されます。括弧は必須です。
USING 節では、ON 節で表現される等値条件を簡潔に表現することができます。例えば、t1 INNER JOIN t2 USING (a,b)t1 INNER JOIN t2 ON t1.a=t2.a AND t1.b=t2.b と同じです。
単方向外部結合
Caché は、単方向外部結合の LEFT OUTER JOIN および RIGHT OUTER JOIN をサポートします。双方向外部結合はサポートしません。
標準の "内部" 結合では、あるテーブルの行が別のテーブルの行にリンクしている場合、後者のテーブルの行と対応しない前者のテーブルの行は、出力テーブルから除外されます。
単方向外部結合では、すべての行が一致しなくても、テーブルの行はすべて出力テーブルに含まれます。前者のテーブルは後者のテーブルから該当する情報を引き出しますが、後者のテーブルに一致する行がなくても、自分の行を犠牲にすることはありません。
例えば、クエリが Table 1 を最初にリストし、左外部結合を作成する場合、対応するレコードが Table 2 内に存在しなくても、Table 1 のすべての行を見ることができます。
単方向外部結合を指定する場合、FROM 節のテーブルを指名する順番が非常に重要です。左外部結合では、指定した最初のテーブルは結合のソース・テーブルです。右外部結合では、指定した 2 番目のテーブルが結合のソース・テーブルです。
RIGHT OUTER JOIN は JOIN 式内の最初の JOIN としてのみサポートされます。
外部結合構文
Caché には、外部結合の表示に 3 種類の形式があります。
  1. ANSI 標準構文の LEFT OUTER JOIN と RIGHT OUTER JOIN。以下の例で示しているように、SQL 標準構文は WHERE 節ではなく、SELECT 文の FROM 節で外部結合を入力します。
    FROM tbl1 LEFT OUTER JOIN tbl2 ON (tbl1.key = tbl2.key) 
    
  2. エスケープ構文 {oj join-expression} を使用する、ODBC 仕様外部結合拡張構文 (join-expression は任意の ANSI 標準結合構文)。
  3. WHERE 節で A=*B などの条件を使用する、シンボル外部結合拡張構文。左外部結合は WHERE 節の = の場所で、=* などのシンボルを使用して指定されます (これは、Microsoft SQL Server や Sybase で使用される構文とは逆であることに注意してください)。右外部結合は WHERE 節の = の場所で、*= などのシンボルを使用して指定されます。
    Note:
    シンボル外部結合構文 (=* および *=) は使用しないことを強くお勧めします。ANSI 標準構文の LEFT OUTER JOIN と RIGHT OUTER JOIN を使用してください。
    3 種類の外部結合形式は互換性があり混在させることもできますが、ANSI 標準構文は ODBC と互換性のある唯一の構文である (また、最新の Microsoft 製品に移植可能である) ことから、可能な限り ANSI 標準構文を使用することを強くお勧めします。また、ANSI 標準構文では、シンボル構文で原則的に指定できない多くのオペレーションを指定することもできます。さらに、インターシステムズでは、古いシンボル外部結合構文で、新しい機能、拡張検証、オプティマイザの改善をサポートする予定はありません。
外部結合の制限事項
FROM 節内の ANSI 標準外部結合には、以下の制限があります。
ANSI 標準外部結合では、ON 節により結合を規定する条件式の機能を実現します。外部結合の ON 節には、内部結合の ON 節よりも厳しい制限があります。外部結合には、以下の制限があります。
ON 節の条件は以下のいずれかの基準を満たしている必要があります ("A LEFT OUTER JOIN B ON 条件式" または "A RIGHT OUTER JOIN B ON 条件式" の場合を想定)。
等式のオペランドは任意の順序で指定できます。例えば、ON A.field1=B.field3 は ON B.field3=A.field1 と同じであり、ON A.field1=literal は ON literal=A.field1 と同じです。
ON 節の等式の演算子に対しては、以下の列のオペランド値を使用できます。
WHERE 節内のシンボル外部結合構文では、以下のオペランド値を使用できます。
詳細は、"Caché SQL の使用法" の "OUTER JOIN の制限" を参照してください。
NULL の埋め込み
単方向外部結合では、NULL の埋め込みが実行されます。ソース・テーブルの行で、マージされる列に NULL 値が存在する場合は、ソースでないテーブルの対応するフィールドに NULL 値が返されます。
左外部結合条件は、以下の構文で表されます。
A.x LEFT OUTER JOIN B.y
これは、A のすべての行が返されることを指定します。返された A の各行では、A.x=B.y などの B 行がある場合、対応するすべての B 値も返されます。
A.x=B.y などの B 行がない場合は、NULL の埋め込みによって A 行に対するすべての B 値を NULL として返すようにします。
例えば、患者に関する情報を格納した Patient テーブルがあり、このテーブルに患者の主治医の ID コードを示すフィールド Patient.DocID が含まれるとします。データベースには主治医がいない患者のレコードがあるため、このような患者のレコードでは Patient.DocID フィールドは NULL になります。ここで、Patient テーブルと Doctor テーブルの結合を実行して、患者名と対応する担当医師名のテーブルを生成します。
以下は INNER JOIN の例です。
SELECT Patient.PName,Doctor.DName
   FROM Patient INNER JOIN Doctor
   ON Patient.DocID=Doctor.DocID
INNER JOIN では、NULL の埋め込みは実行されません。そのため、対応する担当医師名のない患者名は返されません。
単方向外部結合では、NULL の埋め込みが実行されます。そのため、対応する担当医師名のない患者名では、Doctor.DName に NULL が返されます。
SELECT Patient.PName,Doctor.DName
   FROM Patient LEFT OUTER JOIN Doctor
   ON Patient.DocID=Doctor.DocID
演算の順序
必要な NULL の埋め込みも含んだ単方向外部結合条件は、他の条件より前に適用されます。したがって、NULL が埋め込まれた値では満たされない WHERE 節の条件 (例えば、B のフィールド上の値域条件や等値条件) は、A と B の単方向外部結合を標準結合 (内部結合) に効果的に変換します。
例えば、"Where Doctor.Age < 45" という句を、上記の 2 つの "Patient" テーブル・クエリに追加する場合、これらは同じになります。ただし、"WHERE Doctor.Age < 45 OR Doctor.Age IS NULL" という句を追加する場合は、2 つのクエリにおける相違は変わりません。
外部結合と内部結合の混合
通常 Caché は、括弧が使用されていない限り、内部結合と外部結合の混合したすべての構文を任意の順序でサポートします。外部結合の ON 節内の条件には、いくつかの制約があります。例えば、左外部結合では、これらの条件は A=B か X=B の形式にする必要があります。A は左のテーブルのフィールド、B は右のテーブルのフィールド、X は定数かホスト変数です。
以下の例は、Table 1 と Table 2 で実行される JOIN 操作の結果を示しています。
     Table1                Table2 Column1  Column2      Column1  Column3 aaa      bbb          ggg      hhh ccc      ccc          xxx      zzz xxx      yyy hhh      zzz
CROSS JOIN の例
以下に例を示します。
SELECT * FROM Table1 CROSS JOIN Table2
以下のテーブルを作成します。
Column1  Column2  Column1  Column3 aaa      bbb      ggg      hhh aaa      bbb      xxx      zzz ccc      ccc      ggg      hhh ccc      ccc      xxx      zzz xxx      yyy      ggg      hhh xxx      yyy      xxx      zzz hhh      zzz      ggg      hhh hhh      zzz      xxx      zzz
NATURAL JOIN の例
以下に例を示します。
SELECT * FROM Table1 NATURAL JOIN Table2
以下のテーブルを作成します。
Column1  Column2  Column1  Column3 xxx      yyy      xxx      zzz
NATURAL JOIN を実行する場合、Caché は同じ名前を持つ列を統合しません。
ON 節のある INNER JOIN の例
以下に例を示します。
SELECT * FROM Table1 INNER JOIN Table2
     ON Table1.Column1=Table2.Column3
以下のテーブルを作成します。
Column1  Column2  Column1  Column3 hhh      zzz      ggg      hhh
USING 節のある INNER JOIN の例
以下に例を示します。
SELECT * FROM Table1 INNER JOIN Table2
  USING (Column1)
以下のテーブルを作成します。
Column1  Column2  Column1  Column3 xxx      yyy      xxx      zzz
LEFT OUTER JOIN の例
以下に例を示します。
SELECT * FROM Table1 LEFT OUTER JOIN Table2
  ON Table1.Column1=Table2.Column3
以下のテーブルを作成します。
Column1  Column2  Column1  Column3 aaa      bbb      null     null ccc      ccc      null     null xxx      yyy      null     null hhh      zzz      ggg      hhh
RIGHT OUTER JOIN の例
以下に例を示します。
SELECT * FROM Table1 RIGHT OUTER JOIN Table2
     ON Table1.Column1=Table2.Column3
以下のテーブルを作成します。
Column1  Column2  Column1  Column3 hhh      zzz      ggg      hhh null     null     xxx      zzz
関連項目