sql >> データベース >  >> RDS >> Oracle

Oracleのプラス(+)表記とansi JOIN表記の違いは?

    AFAIK、(+) 表記は、結合のANSI標準が導入される前にOracleがデビューしたため、下位互換性のためにのみ存在します。これはOracleに固有であり、同等の標準準拠バージョンが利用可能な場合は、新しいコードでの使用を避ける必要があります。

    この2つと、(+)には違いがあるようです。 表記には、ANSI結合構文にはない制限があります。 Oracle自体は、(+)を使用しないことを推奨しています。 表記法。Oracle®DatabaseSQLLanguageReference11gリリース1(11.1)の詳細な説明:

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

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

    たとえば、次のステートメントは無効です。

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

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



    1. T-SQLのPRINTステートメント

    2. 別のテーブルにないテーブルから選択する

    3. パフォーマンスの驚きと仮定:GROUP BY vs. DISTINCT

    4. 例を使用してSQLで連結する方法について学ぶ