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 つのテーブルを組み合わせて、制限された条件に沿う第 3 のテーブルを作成します。新規のテーブルのすべての行は、制限された条件を満たしている必要があります。JOIN は、テーブルのデータを別のテーブルのデータと結合する手段を提供し、レポートやクエリの定義に頻繁に使用されます。
また、SELECT 文で FROM 節の一部として使用されます。
Caché は、JOIN の複数の異なる構文形式をサポートします。しかし、これら複数の公式化は以下の 4 つの結合のタイプに参照します。
JOIN タイプ 説明
CROSS JOIN FROM 節で、コンマを使用して 2 つのテーブル名を区別するのと同じです。
INNER JOIN JOIN と同じ。記号表現 : "=" (WHERE 節内)
LEFT OUTER JOIN LEFT JOIN と同じ。記号表現 : "=*" (WHERE 節内)
RIGHT OUTER JOIN RIGHT JOIN と同じ。記号表現 : "*=" (WHERE 節内)
LEFT OUTER JOIN と RIGHT OUTER JOIN は機能上ほとんどの点で同一であり (構文が逆)、そのため、集合的に 単方向外部結合 とみなされる場合が多くあります。
INNER JOIN、LEFT OUTER JOIN、および RIGHT OUTER JOIN は、修飾子である NATURAL キーワードの接頭語、ON 節、または USING 節のうちいずれか 1 つのみを取ります。そのため、NATURAL JOIN は、これら JOIN タイプのうちのいずれかに NATURAL キーワードを前に付けたものです。
以下の JOIN は JOIN 式である RIGHT OUTER JOIN、NATURAL JOIN (すべてのタイプ)、USING 節内の JOIN (すべてのタイプ) の最初の結合としてのみサポートされます。
JOIN は、繰り返し使用できます。構文の最後の行に join 引数を含むのと同様に、その時点でどのような形式の JOIN も含めることができます。
JOIN の説明
CROSS JOIN は最初のテーブルの行すべてを次のテーブルの行すべてと交差させる結合です。結果は、多くの重複データを持つ、大きな、論理的に総合的なテーブル (デカルト積) になります。
INNER JOIN は、最初のテーブルを次のテーブルをリンクする結合です。 最初のテーブルの行で、次のテーブル内に対応する行が見つからないものはリンクしません。結果は、各フィールドが一意のデータを含む、小さなテーブルになります。
単方向外部結合 (LEFT OUTER JOIN または RIGHT OUTER JOIN) は、最初のテーブルの行すべてを次のテーブルの行とリンクさせる結合です。 最初のテーブル (ソース・テーブル) の行で、次のテーブルに一致するものが見つからない場合でもリンクします。結果はテーブルで、最初のテーブル (ソース・テーブル) 内にあるフィールドの中には、NULL データと組み合わされるものもあります。
単方向外部結合を指定する場合、FROM 節のテーブルを指名する順番が非常に重要です。LEFT OUTER JOIN では、最初に指定するテーブルが結合のソース・テーブルです。RIGHT OUTER JOIN では、2 つ目に指定するテーブルが結合のソース・テーブルです。このタイプの単方向外部結合には異なる制限があります。
内部結合や外部結合に NATURAL という言葉を添えると、同じ名前を持つテーブルのすべての列を指定することになります。
JOIN の制限事項
INNER JOIN では、条件式には制限がありません。 つまり、どのようなものも有効です。
LEFT 結合や RIGHT 結合は、ON 節の条件式が以下の基準のいずれかを満たす AND や比較で構成される必要があります ("A LEFT JOIN B ON 条件式" または "A RIGHT JOIN B ON 条件式" を仮定)。
詳細は、Caché SQL の使用法OUTER JOIN の制限 を参照してください。
NATURAL 結合の場合、または USING 節との結合の場合、いずれのオペランドに対しても、単純な元のテーブル参照のみをサポートします。
単方向外部結合
Caché は単方向外部結合をサポートします。LEFT OUTER JOIN と RIGHT OUTER JOIN。双方向外部結合はサポートしません。
標準の "内部" 結合では、あるテーブルの行が別のテーブルの行にリンクしている場合、後者のテーブルの行と対応しない前者のテーブルの行は、出力テーブルから除外されます。
単方向外部結合では、すべての行が一致しなくても、テーブルの行はすべて出力テーブルに含まれます。前者のテーブルは後者のテーブルから該当する情報を引き出しますが、後者のテーブルに一致する行がなくても、自分の行を犠牲にすることはありません。
例えば、クエリが Table 1 を最初にリストし、左外部結合を作成する場合、対応するレコードが Table 2 内に存在しなくても、Table 1 のすべての行を見ることができます。
単方向外部結合を指定する場合、FROM 節のテーブルを指名する順番が非常に重要です。左外部結合では、指定した最初のテーブルは結合のソース・テーブルです。右外部結合では、指定した 2 番目のテーブルが結合のソース・テーブルです。
外部結合構文
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 ... } を使用する、ODBC 仕様外部結合拡張構文
  3. WHERE 節で A=*B などの条件を使用する、シンボル外部結合拡張構文。左外部結合は WHERE 節の = の場所で、=* などのシンボルを使用して指定されます。(これは、Microsoft SQL Server で使用される構文とは逆であることに注意してください)。右外部結合は WHERE 節の = の場所で、*= などのシンボルを使用して指定されます。
上記 3 つの形式は互換性があり、混合させることもできます。しかし、ANSI 標準構文の使用をおすすめします。 これは、ODBC との互換性しかないからです (最新の Microsoft 製品とのポートも可能です)。またこれは、シンボル構文で原則的に明記できない多くのオペレーションを指定することもできます。
外部結合の例
内部結合と単方向外部結合の違いの例として、以下のクエリを考えてみます。
SELECT Patient.PName,Doctor.DName
     FROM Patient,Doctor
     WHERE Patient.Doctor = Doctor.Doctor
FROM 節は cross join を指定し、WHERE 節は結果を内部結合に限定します。このクエリは NULL でない "Doctor" フィールドを持つ、"Patient" テーブルの各行に対する一行を返します。それと比較して、以下の左外部結合を見てみましょう。
SELECT Patient.PName,Doctor.DName
     FROM Patient,Doctor
     WHERE Patient.Doctor =* Doctor.Doctor
=* 演算子のみが異なりますが、このクエリは前のクエリのすべての行と、"PatientDoctor" フィールドの NULL 値を持つ "Patient" テーブルの行も返します。このような行では、"DoctorName" は NULL として返されます。これは、"NULL の埋め込み" として知られています。Caché は、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 として返すようにします。
演算の順序
必要な NULL の埋め込みも含んだ単方向外部結合条件は、他の条件より前に適用されます。したがって、NULL が埋め込まれた値では満たされない WHERE 節の条件 (例えば、B のフィールド上の値域条件や等値条件) は、A と B の単方向外部結合を標準結合 (内部結合) に効果的に変換します。
例えば、"AND Doctor.Age < 45" という句を、上記の 2 つの "Pacient" テーブル・クエリーに追加する場合、これらは同じになります。しかし、"AND 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 節での JOIN の例
以下に例があります。
SELECT * FROM Table1 INNER JOIN Table2
     ON Table1.Column1=Table2.Column3
以下のテーブルを作成します。
Column1  Column2  Column1  Column3 hhh      zzz      ggg      hhh
USING 節での 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
関連項目