1. ホーム
  2. sql

オラクルのプラス(+)表記とansiのJOIN表記の違い?

2023-10-03 13:21:58

質問

オラクルのプラス表記と何が違うのですか? (+) を使うのと、アンシ規格の join という表記を使うのでしょうか?

性能に差はありますか?

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

どのように解決するのですか?

AFAIKは (+) 記法は後方互換性のためにのみ存在します。なぜなら、Oracleは結合のためのANSI標準が整備される前にこの記法を導入したからです。これはOracleに特有のもので、同等の標準に準拠したバージョンがある場合は新しいコードで使用しないようにすべきです。

両者には違いがあるようで (+) 記法には ANSI ジョイン構文にはない制約があります。Oracle 自身は (+) 記法を使用しないことを推奨しています。 詳しい説明は Oracle® データベースのSQL言語リファレンス 11g リリース 1 (11.1) :

オラクルでは FROM 節を使うことをお勧めします。 OUTER JOIN 構文を使用します。Oracle 結合演算子を使用する外部結合クエリ (+) には適用されませんが、以下の規則と制限が適用されます。 FROMOUTER JOIN という構文があります。

  • を指定することはできません。 (+) 演算子を含むクエリブロックでは FROM 節結合構文も含んでいます。
  • (+) 演算子は WHERE 句の中、あるいは左相関のコンテキストで (つまり TABLE 節で) FROM 節で、テーブルやビューのカラムにのみ適用することができます。
  • AとBが複数の結合条件によって結合されている場合、その結合条件に対して (+) 演算子を使用しなければなりません。そうしないと、Oracle Database は単純結合の結果の行だけを返しますが、外部結合の結果を持っていないことを知らせる警告やエラーは表示されません。
  • (+) 演算子は、外側クエリで1つのテーブルを指定し、内側クエリでもう1つのテーブルを指定した場合、外側joinを生成しません。
  • を使用することはできません。 (+) 演算子を使用してテーブルをそれ自身に外部結合することはできません。

例えば、以下の文は有効ではありません。

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 つ以上の列を含むことができます。
  • A WHERE を含む条件 (+) 演算子を使った他の条件と組み合わせることはできません。 OR 論理演算子を使用した他の条件と組み合わせることはできません。
  • A WHERE を使用することはできません。 IN でマークされたカラムを比較するために (+) 演算子と式を比較します。

もし WHERE 節にテーブル B のカラムと定数を比較する条件が含まれている場合、テーブル B のカラムと定数を比較するために (+) 演算子を適用し、OracleがテーブルAからこの列に対してNULLを生成した行を返すようにする必要があります。そうでない場合、Oracle は単純結合の結果のみを返します。

2組以上のテーブルの外部結合を行うクエリでは、1つのテーブルが他の1つのテーブルに対してのみNULL生成されたテーブルとなることができます。この理由から (+) 演算子をBのカラムに適用することはできません。 SELECT を参照してください。