(+)
Oracle のプラス表記法と ANSI 標準表記法の違いは何ですかjoin
?
パフォーマンスに違いはありますか?
プラス表記は非推奨ですか?
ベストアンサー1
私の知る限り、この(+)
表記法は、Oracle が ANSI 標準の結合が導入される前に導入したため、下位互換性のためにのみ存在します。これは Oracle 固有のものであり、同等の標準準拠バージョンが利用できる場合は、新しいコードで使用しないでください。
両者には違いがあるようで、この(+)
表記法にはANSI結合構文にはない制限があります。Oracle自身もこの(+)
表記法を使用しないことを推奨しています。完全な説明はここOracle® Database SQL 言語リファレンス 11g リリース 1 (11.1):
Oracle では、 Oracle 結合演算子ではなく
FROM
句OUTER JOIN
構文を使用することをお勧めします。Oracle 結合演算子を使用する外部結合クエリには、句構文(+)
には適用されない次のルールと制限が適用されます。FROM
OUTER JOIN
- 句結合構文
(+)
も含まれるクエリ ブロックでは演算子を指定できません。FROM
- 演算子は、句内でのみ、または句内の左相関のコンテキスト (句を指定する場合)で
(+)
のみ使用でき、テーブルまたはビューの列にのみ適用できます。WHERE
TABLE
FROM
- 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