web-dev-qa-db-ja.com

Oracle「(+)」演算子

それらを文書化し、おそらく強化するために、いくつかの古いSQLステートメントをチェックしています。

DBMSはOracleです

私は次のような文を理解していませんでした:

select ...
from a,b
where a.id=b.id(+)

(+)演算子について混乱しており、どのフォーラムでも取得できませんでした(引用符内で+を検索しても機能しませんでした)。

とにかく、SQLDeveloperの「計画の説明」を使用し、HASH JOIN, RIGHT OUTERなどの出力が得られました。

クエリの最後で(+)演算子を削除した場合、違いはありますか? (+)を使用する前に、データベースが何らかの条件を満たす必要がありますか(インデックスがあるなど)。あなたが私に簡単な理解、またはこれについて読むことができるいくつかの良いリンクを提供できるならば、それは大いに役立つでしょう。

ありがとう!

142
Sekhar

ANSI-89形式(FROM句でコンマを使用してテーブル参照を区切る)はOUTER結合を標準化していないため、これはOUTER JOINのOracle固有の表記法です。

クエリは、ANSI-92構文で次のように書き換えられます。

   SELECT ...
     FROM a
LEFT JOIN b ON b.id = a.id

このリンクはJOINの違いを説明するのに非常に適しています


また、(+)は機能しますが、 Oracleはnotを使用することをお勧めします

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

170
OMG Ponies

(+)演算子は、外部結合を示します。つまり、一致しない場合でも、Oracleは結合の反対側からレコードを返します。たとえば、aとbがempとdeptであり、従業員を部門に割り当てないようにできる場合、次のステートメントは、部門に割り当てられているかどうかに関係なく、すべての従業員の詳細を返します。

select * from emp, dept where emp.dept_id=dept.dept_id(+)

要するに、(+)を削除すると重要な違いが生じるかもしれませんが、データによってはしばらく気付かないかもしれません!

26
hot dog

Oracleでは、(+)はJOINの「オプション」テーブルを示します。クエリで、

SELECT a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id=b.id(+)

テーブル 'b'からテーブル 'a'へのLEFT OUTER JOINです。反対側(オプションのテーブル 'b')にデータがない場合、データを失うことなく、テーブル 'a'のすべてのデータを返します。

Diagram of Left Outer Join

同じクエリの最新の標準構文は次のようになります

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
LEFT JOIN b ON a.id=b.id

またはa.id=b.idの省略形を使用して(すべてのデータベースでサポートされているわけではありません):

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
LEFT JOIN b USING(id)

(+)を削除すると、通常の内部結合クエリになります

Oracleと他のデータベースの両方の古い構文:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id=b.id

より現代的な構文:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
INNER JOIN b ON a.id=b.id

または単に:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
JOIN b ON a.id=b.id

Diagram of Inner Join

「a」テーブルと「b」テーブルの両方の「id」値が同じであるすべてのデータのみが返され、共通部分を意味します。

クエリを右結合にしたい場合

これはLEFT JOINとまったく同じですが、オプションのテーブルを切り替えます。

Diagram of Right Outer Join

古いOracle構文:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id(+)=b.id

最新の標準構文:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
RIGHT JOIN b ON a.id=b.id

参照とヘルプ:

https://asktom.Oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:6585774577187

Oracle 11gで+記号を使用した左外部結合

https://www.w3schools.com/sql/sql_join_left.asp

実際には、+記号は、条件ステートメント内およびオプションのテーブル(条件内に空またはNULL値を含めることができるテーブル)の側に直接配置されます。

6
sunny