Oracle のプラス (+) 表記と ANSI JOIN 表記の違いは何ですか? 質問する

Oracle のプラス (+) 表記と ANSI JOIN 表記の違いは何ですか? 質問する

(+)Oracle のプラス表記法と ANSI 標準表記法の違いは何ですかjoin?

パフォーマンスに違いはありますか?

プラス表記は非推奨ですか?

ベストアンサー1

私の知る限り、この(+)表記法は、Oracle が ANSI 標準の結合が導入される前に導入したため、下位互換性のためにのみ存在します。これは Oracle 固有のものであり、同等の標準準拠バージョンが利用できる場合は、新しいコードで使用しないでください。

両者には違いがあるようで、この(+)表記法にはANSI結合構文にはない制限があります。Oracle自身もこの(+)表記法を使用しないことを推奨しています。完全な説明はここOracle® Database SQL 言語リファレンス 11g リリース 1 (11.1):

Oracle では、 Oracle 結合演算子ではなくFROMOUTER JOIN構文を使用することをお勧めします。Oracle 結合演算子を使用する外部結合クエリには、句構文(+)には適用されない次のルールと制限が適用されます。FROMOUTER JOIN

  • 句結合構文(+)も含まれるクエリ ブロックでは演算子を指定できません。FROM
  • 演算子は、句内でのみ、または句内の左相関のコンテキスト (句を指定する場合)で(+)のみ使用でき、テーブルまたはビューの列にのみ適用できます。WHERETABLEFROM
  • A と B が複数の結合条件によって結合されている場合、(+)これらすべての条件で演算子を使用する必要があります。そうしないと、Oracle Database は単純な結合の結果の行のみを返しますが、外部結合の結果がないことを通知する警告やエラーは表示されません。
  • (+)外部クエリで 1 つのテーブルを指定し、内部クエリで別のテーブルを指定した場合、演算子は外部結合を生成しません。
  • (+)自己結合は有効ですが、演算子を使用してテーブルをそれ自体に外部結合することはできません。

たとえば、次の文は無効です。

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 は単純な結合の結果のみを返します。

2 組以上のテーブルの外部結合を実行するクエリでは、1 つのテーブルが他の 1 つのテーブルに対してのみ NULL 生成テーブルになることができます。このため、A と B の結合条件および B と C の結合条件で、B の列に演算子を適用することはできません。外部結合の構文については、(+)を参照してください。SELECT

おすすめ記事