オラクルのプラス(+)表記とansiのJOIN表記の違い?
質問
オラクルのプラス表記と何が違うのですか?
(+)
を使うのと、アンシ規格の
join
という表記を使うのでしょうか?
性能に差はありますか?
プラス表記は非推奨ですか?
どのように解決するのですか?
AFAIKは
(+)
記法は後方互換性のためにのみ存在します。なぜなら、Oracleは結合のためのANSI標準が整備される前にこの記法を導入したからです。これはOracleに特有のもので、同等の標準に準拠したバージョンがある場合は新しいコードで使用しないようにすべきです。
両者には違いがあるようで
(+)
記法には ANSI ジョイン構文にはない制約があります。Oracle 自身は
(+)
記法を使用しないことを推奨しています。
詳しい説明は
Oracle® データベースのSQL言語リファレンス
11g リリース 1 (11.1)
:
オラクルでは
FROM
節を使うことをお勧めします。OUTER JOIN
構文を使用します。Oracle 結合演算子を使用する外部結合クエリ(+)
には適用されませんが、以下の規則と制限が適用されます。FROM
節OUTER 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
を参照してください。
関連
-
[解決済み] callとapplyの違いは何ですか?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] UNIONとUNION ALLの違いは何ですか?
-
[解決済み] JOINとINNER JOINの違いについて
-
[解決済み] 項目xにアクセスできるように文字列を分割するにはどうすればよいですか?
-
[解決済み] C言語のi++と++iに性能差はあるのでしょうか?
-
[解決済み] C++でi++と++iの間に性能差はありますか?
-
[解決済み】「INNER JOIN」と「OUTER JOIN」の違いは何ですか?
-
[解決済み】ジョインとサブクエリの比較
-
[解決済み】Count(*)とCount(1)の比較 - SQL Server
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MHAクラスタエラーサマリーの構築
-
[解決済み] SQLのカラム名があいまいな場合のクエリエラー
-
[解決済み] SQLの結合形式 - 入れ子になった内側join
-
[解決済み] テーブルネーミングのジレンマ:単数形と複数形の名前【非公開
-
[解決済み] SQL Serverでシングルクォートをエスケープするにはどうすればよいですか?
-
[解決済み] SQL Serverにおける関数とストアドプロシージャの比較
-
[解決済み] 最初の行への結合方法
-
[解決済み] SQLの複数列の順序付け
-
[解決済み] "ON UPDATE CASCADE "を使用する場合について
-
[解決済み] Selectステートメントで特定のフィールドの重複を検索する