- ベストアンサー
外部結合について
こんばんは。 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つの表と外部結合されています」みたいに エラーがでてしまいます。 どのように修正すれば、よいのでしょうか? よろしくお願い致します。 ※全角になっているなどは、見やすくする為にやっています。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>この場合、Aのテーブルに対して外部結合をしていると言う >表現になるのでしょうか?? その表現でいいと思います。 結合条件が複数ある場合は、全ての列に(+)が必要です。 また、結合するテーブルが3つ以上のときは、 A.列名 = B.列名(+) AND B.列名 = C.列名(+) としてはダメで、 A.列名 = B.列名(+) AND A.列名 = C.列名(+) というふうに、1つのテーブルを中心にして、 他のテーブルと結合するようにします。
その他の回答 (3)
- diddyumoma
- ベストアンサー率33% (3/9)
こんにちは。 No.2の方が詳しく書かれていますが、 要するに 「データが無くても、無理矢理くっつけたいテーブル」 のほうに対して「(+)」を指定すれば良いのです。 質問のところに書いてある構文だと、 逆になってしまっているのが原因ですね。
お礼
ご回答ありがとうございます。 くっつけたい方に (+)をつければ良かったんですね。 まったくもって、逆でした(^^;) これで、構文エラーもなく、期待通りのデータが取得できました。 ありがとうございました。
- kawa457
- ベストアンサー率100% (1/1)
ユーザ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'; で、外部結合できるはずです。
お礼
ご回答ありがとうございます。 上記のようにすれば良いのですね。 勉強になります。 この場合、Aのテーブルに対して外部結合をしていると言う 表現になるのでしょうか?? まだ、外部結合について理解が乏しくて、このような質問で 申し訳ありません。本なんかを読んでいても外部結合について なかなか理解できなくて・・。 よろしくお願い致します。
- sen-sen
- ベストアンサー率31% (66/211)
>データを取得しいテーブルが4つあったとします。 A、B、Cの3つではないでしょうか。 >Aテーブルのキーは、「ユーザーID」と「名前」と「住所」だとします。 Bテーブルのキーは、「名前」と「郵便番号」とします。 Cテーブルのキーは、「名前」と「郵便番号」とします。 キーは各テーブルに共通したものとするのがよいのではないでしょうか。 >A.ユーザーID = ’XXXXX’, A.名前 = ’AAAAAA’, A.住所 = ’KKKKKKKKKKK’ これだと特定のレコードしか選ばれないのではないでしょうか。また、これらの条件の間に論理記号が必要ではないでしょうか。
補足
すいません。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)は必ずデータとして、 帰ってきて欲しいと思っています。 このような場合に、どのように記述すればよいでしょうか?? よろしくお願い致します。 ※わかりにくい点などありましたら、どんどんご指摘ください。
お礼
またまた、ご回答ありがとうございます。 そして、返事が遅くなってすいません。 上記の書き方にてうまくいきました。 やっと、少しずつ理解できてきたように思います。 ありがとうございました。