結合

結合は2つ以上の表、ビューまたはマテリアライズド・ビューからの行を組み合せる問合せです。複数の表が問合せのFROM句に指定される場合、Oracle Databaseは結合を実行します。問合せのSELECT構文のリストは、これらの表のいずれかの任意の列を選択することができます。これらの表のいずれか2つに共通の列名を持つものがある場合、問合せの間、これらの列に対してすべての参照を明確にするために表の名前を付けて修飾する必要があります。

結合条件

ほとんどの結合問合せには、FROM句またはWHERE句のいずれかに1つ以上の結合条件が含まれます。結合条件によって、異なる表から2つの列が比較されます。結合を実行するために、Oracle Databaseは各表に1つずつ含まれている列を結合し、結合条件がTRUEになるようにします。結合条件の列をSELECT構文のリストに表示する必要はありません。

3つ以上の表を結合するために、Oracleはまず列を比較する結合条件に基づいて2つの表を結合し、結合された表と新規の表の列を含む結合条件に基づいて、さらにもう1つの表を結合します。すべての表が結果に結合されるまで、このプロセスを継続します。オプティマイザは、Oracleが結合条件に基づいて表を結合する順序、表の索引、および任意の使用可能な表の統計を決定します。

結合条件を含むWHERE句には、1つの表のみの列を参照する別の条件も含めることができます。これらの条件は、結合問合せによって戻された列をさらに制限することができます。

ノート:

WHERE句に結合条件が含まれる場合、WHERE句にはLOB列を指定できません。WHERE句でのLOBの使用については、他にも制限事項があります。詳細は、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』を参照してください。

等価結合

等価結合とは、等価演算子を含む結合条件での結合のことです。等価結合は、指定した列に同等の値を持つ行を結合します。オプティマイザが結合の実行を選択する内部アルゴリズムによって、1つの表の等価結合条件における列の合計サイズは、データ・ブロックのサイズ以下に制限される可能性があります。データ・ブロックのサイズは、初期化パラメータDB_BLOCK_SIZEによって指定されます。

バンド結合

バンド結合は、データ・セットのキー値が2番目のデータ・セットの指定された範囲(「バンド」)に収まる必要がある特殊なタイプの非等価結合です。最初のデータ・セットと2番目のデータ・セットの両方として同じ表が使用されます。

関連項目:

自己結合

自己結合とは、自己の表結合のことです。この表はFROM句に2回指定され、結合条件の列名を修飾する表の別名が続きます。自己結合を実行するために、Oracle Databaseは結合条件を満たす表の行を結合して戻します。

デカルト積

結合問合せの2つの表に結合条件がない場合、Oracle Databaseはデカルト積を戻します。この場合、1つの表の各行が別の表の各行に結合されます。デカルト積は常に多数の行を生成するため、有効ではありません。たとえば、それぞれが100行を持つ2つの表のデカルト積は10,000行を生成します。特にデカルト積を必要としないかぎり、必ず結合条件を指定してください。問合せが3つ以上の表を結合し、特定の組に対して結合条件を指定しない場合、オプティマイザは、中間のデカルト積を生成しないように結合順序を選択する可能性があります。

内部結合

内部結合(単純結合)とは、結合条件を満たす行のみを戻す、複数の表の結合です。

外部結合

外部結合は、単純結合の結果を拡張します。外部結合では、結合条件を満たすすべての行に加えて、他の表に結合条件を満たす行が含まれていなくても表の一部またはすべての行が返されます。

  • 表AおよびBの外部結合を行い、すべての行をAから戻す問合せ(左側外部結合)を記述するには、FROM句でLEFT [OUTER] JOIN構文を使用するか、WHERE句の結合条件で外部結合演算子(+)をBのすべての列に適用します。Bに一致する行のないAのすべての行に関して、Oracle Databaseは、Bの列を含む任意のSELECT構文のリストの式にNULLを戻します。

  • 表AおよびBの外部結合を行い、すべての行をBから戻す問合せ(右側外部結合)を記述するには、FROM句でRIGHT [OUTER] JOIN構文を使用するか、WHERE句の結合条件で外部結合演算子(+)をAのすべての列に適用します。Aに一致する行のないBのすべての行に関して、Oracleは、Aの列を含む任意のSELECT構文のリストの式にNULLを戻します。

  • 外部結合を行い、結合条件を満たさない場合にすべての行をAおよびBからNULLで拡張して戻す問合せ(完全外部結合)を記述するには、FROM句でFULL [OUTER] JOIN構文を使用します。

指定する書式にかかわらず、外部結合のWHERE句の副問合せでは列を比較できません。

外部結合を使用すると、疎データ内の欠損を補完できます。このような結合はパーティション化された外部結合と呼ばれ、join_clause構文のquery_partition_clauseを使用して形成されます。疎データとは、時刻や部門などのディメンションの一部の値に対する行を持たないデータです。たとえば、販売データの表には通常、売上のない任意の日付の製品に対する行は存在しません。データの欠損の補完は、データの欠損によって分析計算が複雑になる場合や、疎データを直接問い合せた場合に一部のデータを見逃す可能性がある際に役立ちます。

関連項目:

Oracleの結合演算子よりも、FROM句のOUTER JOIN構文を使用することをお薦めします。Oracleの結合演算子(+)を使用した外部結合問合せには、次の規則と制限事項があります(これらの規則や制限事項は、FROM句のOUTER JOIN構文にはありません)。

  • FROM句の結合構文を含む問合せブロックには結合演算子(+)を指定できません。

  • 結合演算子(+)は、WHERE句またはFROM句の左相関のコンテキスト(TABLE句を指定する場合)にのみ指定でき、表またはビューの列にのみ適用されます。

  • AおよびBが複数の結合条件によって結合される場合、これらの条件のすべてにおいて結合演算子(+)を使用する必要があります。使用しない場合、Oracle Databaseは単純結合の結果である行のみを戻しますが、外部結合の結果がないことを示す警告やエラーは出力しません。

  • ある表を外部問合せに指定して別の表を内部問合せに指定した場合、結合演算子(+)は外部結合を生成しません。

  • 自己結合が有効であっても、結合演算子(+)を使用して表を自己に外部結合することはできません。たとえば、次の文は無効です。

    -- The following statement is not valid:
    SELECT employee_id, manager_id 
       FROM employees
       WHERE employees.manager_id(+) = employees.employee_id;
    

    ただし、次の自己結合は有効です。

    SELECT e1.employee_id, e1.manager_id, e2.employee_id
       FROM employees e1, employees e2
       WHERE e1.manager_id(+) = e2.employee_id
       ORDER BY e1.employee_id, e1.manager_id, e2.employee_id;
  • 結合演算子(+)は任意の式ではなく、列にのみ適用することができます。ただし、任意の式には結合演算子(+)でマークされた1つ以上の列を含めることができます。

  • 結合演算子(+)を含むWHERE条件は、OR論理演算子を使用する他の条件と結合できません。

  • WHERE条件は、IN比較条件を使用して、結合演算子(+)でマークされた列を式と比較できません。

WHERE句に表Bの列と定数を比較する条件が含まれる場合、Oracleがこの列に対してNULLを生成する表Aの列を戻すように、結合演算子(+)をこの列に適用する必要があります。それ以外の場合、Oracleは単純結合の結果のみを戻します。

以前のリリースのOracle Databaseでは、2組以上の表の外部結合を実行する問合せで、単一表は他の1つの表のみに対してNULL生成された表にすることができました。Oracle Database 12c以降では、単一表は複数の表に対してNULL生成された表にすることができます。たとえば、Oracle Database 12cでは、次の文が許容されています。

SELECT * FROM A, B, D
  WHERE A.c1 = B.c2(+) and D.c3 = B.c4(+);

この例では、NULL生成された表Bは、2つの表ADに外部結合されます。外部結合の構文については、「SELECT」を参照してください。

アンチ結合

アンチ結合は、述語の右側に対応する行を持たない述語の左側の行を戻します。この結合は、右側の副問合せに一致しない(NOT IN)行を戻します。

セミ結合

セミ結合は、述語の右側の複数の行が副問合せの条件を満たす場合に、述語の左側から行を重複させずにEXISTS副問合せに一致する行を戻します。

副問合せがWHERE句のORブランチに指定されている場合、セミ結合およびアンチ結合変換は実行できません。

関連項目:

セミ結合の使用方法: 例