SQLを見てるとたまにWHERE句内で「(+)」と記載されているのを見かけることがあります。
この「(+)」はOracle独自で記載が可能となる外部結合演算子といって、「g.GOODS_CODE = gt.GOODS_CODE(+)」のように指定するとLEFT OUTER JOINと同じ結果を取得することが出来ます。
サンプルテーブル
外部結合演算子を利用したクエリー(SQL)例
|
1 2 3 |
SELECT g.name, gt.type_name FROM USER1.GOODS g, USER1.GOODS_TYPE gt WHERE g.GOODS_CODE = gt.GOODS_CODE(+); |
通常の左外部結合でのクエリー(SQL)例
|
1 2 3 |
SELECT g.name, gt.type_name FROM USER1.GOODS g LEFT OUTER JOIN USER1.GOODS_TYPE gt ON g.GOODS_CODE = gt.GOODS_CODE; |
実行結果
外部結合演算子、左外部結合どちらも同じ結果となります。
補足
「(+)」演算子の歴史的背景
Oracle の古いバージョンからサポートされていた外部結合の書き方で、ANSI SQL 標準が普及する以前によく使われていました。ANSI 標準(LEFT JOIN/RIGHT JOIN/FULL OUTER JOIN)が登場して以降は、可読性・移植性の観点から推奨されないことが多いです。制限・注意点
ANSI 標準との違い
項目 (+) 外部結合演算子 ANSI SQL 外部結合 (LEFT OUTER JOIN 等) 可読性 やや分かりにくい 比較的分かりやすい 移植性 Oracle に依存 多くの RDBMS でサポートされる 複雑な JOIN の組み立て エラーや誤解の元になりやすい ON 句で明示的に指定できるため制御しやすい サポート状況 最新 Oracle でも非推奨の方向 推奨される方式 現代のベストプラクティス
互換性・移行のヒント
よくある質問(Q & A)
- WHERE句の「(+)」は何を意味しますか?
-
「(+)」は Oracle独自の外部結合指定です。
(+)を付けた側のテーブルに一致するデータがなくても、結果に含めます。 - 「(+)」は LEFT JOIN と同じ意味ですか?
-
はい。次の2つは同じ意味です。
WHERE A.ID = B.ID(+)LEFT OUTER JOIN B ON A.ID = B.ID現在は
JOIN ... ON構文の使用が推奨されています。 - 「(+)」はなぜ使わない方がよいのですか?
-
「(+)」は Oracle専用の古い記法で、
・読みづらい
・他DBでは動かない
という欠点があります。
そのため、標準SQLのJOIN構文に書き換えるのが望ましいです。




