AFAIK、(+)
表記は、結合のANSI標準が導入される前にOracleがデビューしたため、下位互換性のためにのみ存在します。これはOracleに固有であり、同等の標準準拠バージョンが利用可能な場合は、新しいコードでの使用を避ける必要があります。
この2つと、(+)
には違いがあるようです。 表記には、ANSI結合構文にはない制限があります。 Oracle自体は、(+)
を使用しないことを推奨しています。 表記法。Oracle®DatabaseSQLLanguageReference11gリリース1(11.1)の詳細な説明:
FROM
を使用することをお勧めします 句OUTERJOIN
Oracleの結合演算子ではなく構文。 Oracle結合演算子(+)
を使用する外部結合クエリFROM
には適用されない、以下の規則と制限が適用されます。 句OUTERJOIN
構文:
(+)
は指定できませんFROM
も含むクエリブロックの演算子 句結合構文。(+)コード> 演算子は
WHERE
にのみ表示できます 句または、左相関のコンテキストで(TABLE
を指定する場合) 句)FROM
内 句であり、テーブルまたはビューの列にのみ適用できます。- AとBが複数の結合条件で結合されている場合は、
(+)
を使用する必要があります これらすべての条件での演算子。そうしないと、Oracle Databaseは単純結合の結果の行のみを返しますが、外部結合の結果がないことを通知する警告やエラーは表示されません。(+)コード> 外部クエリで一方のテーブルを指定し、内部クエリでもう一方のテーブルを指定した場合、演算子は外部結合を生成しません。
(+)
は使用できません 自己結合は有効ですが、テーブルをそれ自体に外部結合する演算子。たとえば、次のステートメントは無効です。
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;
(+)コード> 演算子は列にのみ適用でき、任意の式には適用できません。ただし、任意の式には、
(+)
でマークされた1つ以上の列を含めることができます。 オペレーター。WHERE
(+)
を含む条件OR
を使用して演算子を別の条件と組み合わせることはできません 論理演算子。WHERE
条件はIN
を使用できません(+)
でマークされた列を比較するための比較条件 式を使用した演算子。
WHERE
の場合 句には、テーブルBの列を定数と比較し、次に(+)
を比較する条件が含まれています。 Oracleがこの列に対してnullを生成したテーブルAの行を返すように、演算子を列に適用する必要があります。それ以外の場合、Oracleは単純な結合の結果のみを返します。3つ以上のテーブルのペアの外部結合を実行するクエリでは、1つのテーブルを他の1つのテーブルに対してのみnullで生成されたテーブルにすることができます。このため、
(+)
を適用することはできません AとBの結合条件およびBとCの結合条件のBの列への演算子。SELECT
を参照してください。 外部結合の構文について。