• ベストアンサー

外部結合について

外部結合というのは、表と表を結合するという事で FROM句に書くべきことと思うのですが、 なぜWHERE句(カラム毎に指定)で指定するのでしょうか? 例えば、 テーブルA No|Kind|Name| ------------- 1|1 |A | 1|2 |B | 2|1 |C | 2|2 |D | テーブルB No|Kind|Data| ------------- 1|1 |10| 外部結合で SELECT A.No, A.Kind, A.Name, B.Data FROM A,B WHERE A.No = B.No(+) AND A.Kind = B.Kind(+) とすると No|Kind|Name|Data| ------------------ 1|1 |A |10| 1|2 |B |NULL| 2|1 |C |NULL| 2|2 |D |NULL| となります。 A.NoがB.NoになくてもOKで、Kindは 完全に一致しないとだめという意味で SELECT A.No, A.Kind, A.Name, B.Data FROM A,B WHERE A.No = B.No(+) AND A.Kind = B.Kind とした場合、 No|Kind|Name|Data| ------------------ 1|1 |A |10| 2|1 |C |NULL| となるのであれば納得いくのですが、 結果は↓なるようです。 No|Kind|Name|Data| -------------------------- 1|1 |A |10| (+)を一つも付けてない場合と 同じ動作になるようです。 テーブルAとテーブルBを結合するとき、 「外部結合する場合はWHERE句で指定する選択の条件全てに(+)を付ける」 「外部結合をしない場合はWHERE句で指定する選択の条件全てに(+)を付けない」 であれば、カラム毎に外部結合演算子を指定する意味が無いと思うのですが。 どなたか、カラム毎に外部結合演算子を指定する意味をご教授下さい。 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • entree
  • ベストアンサー率55% (405/735)
回答No.1

Oracle 社がなぜそのようなルールを決めたのかは分かりませんが、SQL99 標準では外部結合について記述があり、Oracle 9i 以降ではこれをサポートしています。 > SELECT A.No, A.Kind, A.Name, B.Data > FROM A,B > WHERE A.No = B.No(+) > AND A.Kind = B.Kind これを SQL99 標準の書き方に直すと SELECT A.No, A.Kind, A.Name, B.Data FROM A LEFT OUTER JOIN B ON A.No = B.No AND A.Kind = B.Kind となります。この書式では FROM 句のところに、結合方法や結合条件について書かれていますね。 外部結合時に (+) をつけるのは Oracle 社の独自仕様であり特別な理由については深く追求されない方がよいかと思います。少なくとも、この書き方が SQL99 標準に取り込まれなかったのは、標準化団体にこの書き方が望ましくないと判断されたからでしょう。

pokopen18
質問者

お礼

詳しい説明ありがとうございました。 (+)は標準的な記述ではないのですね。 参考になりました。

その他の回答 (1)

  • MZ-80B
  • ベストアンサー率56% (46/81)
回答No.2

外部結合演算子は ANSI/ISO で規格化されるより ずっーと以前の書式だったと思います。 参考URLに色々な制約事項がまとまっています。 左(右)外部結合とは機能に差がありますから期待する結果と異なります。 いまだに現役で使用されているのは、枯れた記法なのでバグが非常に低いからですね。 将来 RBO のようにサポート対象外になる可能性がありそうです。

参考URL:
http://biz.rivus.jp/technote507039.html
pokopen18
質問者

お礼

詳しい説明ありがとうございました。 提示いただいたURLはとても参考になります。

関連するQ&A