それらを文書化し、おそらく強化するために、いくつかの古いSQLステートメントをチェックしています。
DBMSはOracleです
私は次のような文を理解していませんでした:
select ...
from a,b
where a.id=b.id(+)
(+)
演算子について混乱しており、どのフォーラムでも取得できませんでした(引用符内で+を検索しても機能しませんでした)。
とにかく、SQLDeveloperの「計画の説明」を使用し、HASH JOIN, RIGHT OUTER
などの出力が得られました。
クエリの最後で(+)
演算子を削除した場合、違いはありますか? (+)
を使用する前に、データベースが何らかの条件を満たす必要がありますか(インデックスがあるなど)。あなたが私に簡単な理解、またはこれについて読むことができるいくつかの良いリンクを提供できるならば、それは大いに役立つでしょう。
ありがとう!
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の結合演算子(+)
を使用する外部結合クエリには、FROM
句OUTER JOIN
構文には適用されない以下の規則と制限が適用されます。
(+)演算子は、外部結合を示します。つまり、一致しない場合でも、Oracleは結合の反対側からレコードを返します。たとえば、aとbがempとdeptであり、従業員を部門に割り当てないようにできる場合、次のステートメントは、部門に割り当てられているかどうかに関係なく、すべての従業員の詳細を返します。
select * from emp, dept where emp.dept_id=dept.dept_id(+)
要するに、(+)を削除すると重要な違いが生じるかもしれませんが、データによってはしばらく気付かないかもしれません!
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'のすべてのデータを返します。
同じクエリの最新の標準構文は次のようになります
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
「a」テーブルと「b」テーブルの両方の「id」値が同じであるすべてのデータのみが返され、共通部分を意味します。
これはLEFT 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
実際には、+記号は、条件ステートメント内およびオプションのテーブル(条件内に空またはNULL値を含めることができるテーブル)の側に直接配置されます。