• ベストアンサー

外部結合について

こんばんは。 SQLでの外部結合について教えてください。(オラクルの場合です) データを取得しいテーブルが4つあったとします。 Aテーブルのキーは、「ユーザーID」と「名前」と「住所」だとします。 Bテーブルのキーは、「名前」と「郵便番号」とします。 Cテーブルのキーは、「名前」と「郵便番号」とします。 取得したいデータは、全てのテーブルに存在しています。 Aテーブルに対してBテーブルとCテーブルを外部結合したいと思っています。 Aテーブルには「ユーザーID」があります。 Bテーブルからは、「給料」データが取得したいのです。 Cテーブルからは、「年齢」データが取得したいのです。 B,Cのテーブルに条件に合致するものがなくても、AのユーザーIDだけは 表示したいと思っています。 自分なりに考えて色々試したのですが、うまく行かず構文でエラーになります。 どうしてもAテーブルに外部結合したいです。 SELECT  A.ユーザーID,  B.給料,  C.年齢 FROM  A,  B,  C WHERE  A.ユーザーID = ’XXXXX’,      A.名前 = ’AAAAAA’,      A.住所 = ’KKKKKKKKKKK’,      A.名前(+) = B.名前,      A.名前(+) = C.名前,      A.郵便番号(+) = B.郵便番号,      A.郵便番号(+) = C.郵便番号 このように考えたのですが,「すでに1つの表と外部結合されています」みたいに エラーがでてしまいます。 どのように修正すれば、よいのでしょうか? よろしくお願い致します。      ※全角になっているなどは、見やすくする為にやっています。

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

  • ベストアンサー
  • kawa457
  • ベストアンサー率100% (1/1)
回答No.3

>この場合、Aのテーブルに対して外部結合をしていると言う >表現になるのでしょうか?? その表現でいいと思います。 結合条件が複数ある場合は、全ての列に(+)が必要です。 また、結合するテーブルが3つ以上のときは、 A.列名 = B.列名(+) AND B.列名 = C.列名(+) としてはダメで、 A.列名 = B.列名(+) AND A.列名 = C.列名(+) というふうに、1つのテーブルを中心にして、 他のテーブルと結合するようにします。

mkim
質問者

お礼

またまた、ご回答ありがとうございます。 そして、返事が遅くなってすいません。 上記の書き方にてうまくいきました。 やっと、少しずつ理解できてきたように思います。 ありがとうございました。

その他の回答 (3)

回答No.4

こんにちは。 No.2の方が詳しく書かれていますが、 要するに 「データが無くても、無理矢理くっつけたいテーブル」 のほうに対して「(+)」を指定すれば良いのです。 質問のところに書いてある構文だと、 逆になってしまっているのが原因ですね。

mkim
質問者

お礼

ご回答ありがとうございます。 くっつけたい方に (+)をつければ良かったんですね。 まったくもって、逆でした(^^;) これで、構文エラーもなく、期待通りのデータが取得できました。 ありがとうございました。

  • kawa457
  • ベストアンサー率100% (1/1)
回答No.2

ユーザIDがそれぞれのテーブルの単一のキーで、 Bテーブルからは、「給料」データを、 Cテーブルからは、「年齢」データを 取得するものとして回答します。 SELECT A.ユーザID, B.給料, C.年齢 FROM A, B, C WHERE A.ユーザID = B.ユーザID(+) AND A.ユーザID = C.ユーザID(+) AND A.ユーザID = 'XXXXX' AND A.名前 = 'XXXXX'; で、外部結合できるはずです。

mkim
質問者

お礼

ご回答ありがとうございます。 上記のようにすれば良いのですね。 勉強になります。 この場合、Aのテーブルに対して外部結合をしていると言う 表現になるのでしょうか?? まだ、外部結合について理解が乏しくて、このような質問で 申し訳ありません。本なんかを読んでいても外部結合について なかなか理解できなくて・・。 よろしくお願い致します。

  • sen-sen
  • ベストアンサー率31% (66/211)
回答No.1

>データを取得しいテーブルが4つあったとします。 A、B、Cの3つではないでしょうか。 >Aテーブルのキーは、「ユーザーID」と「名前」と「住所」だとします。 Bテーブルのキーは、「名前」と「郵便番号」とします。 Cテーブルのキーは、「名前」と「郵便番号」とします。 キーは各テーブルに共通したものとするのがよいのではないでしょうか。 >A.ユーザーID = ’XXXXX’,      A.名前 = ’AAAAAA’,      A.住所 = ’KKKKKKKKKKK’ これだと特定のレコードしか選ばれないのではないでしょうか。また、これらの条件の間に論理記号が必要ではないでしょうか。

mkim
質問者

補足

すいません。3つのテーブルでした(^^;) 例としてあげたものが、少し不適切でした。 少し変えて例をあげたいと思います。 Aテーブルのキー: ユーザーID、名前、誕生月 Bテーブルのキー: ユーザーID、名前 Cテーブルのキー: ユーザーID、名前 となっています。 3つのテーブルからデータが取得したい点は変わりません。 必ず表示させたいのは、「誕生月」とします。 WHERE  A.ユーザーID(+) = B.ユーザーID AND A.ユーザーID(+) = C.ユーザーID AND      A.名前(+) = B.名前 AND      A.名前(+) = B.名前 AND      A.ユーザーID = ’AAAAAA’ AND      A.誕生月 IN('1’, '2', '5') 上記のように複数の誕生月があって、誕生月に対応するデータがB表、 C表になかった場合でも、誕生月の(1,2,5)は必ずデータとして、 帰ってきて欲しいと思っています。 このような場合に、どのように記述すればよいでしょうか?? よろしくお願い致します。 ※わかりにくい点などありましたら、どんどんご指摘ください。