こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

外部結合について

こんばんは。
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つの表と外部結合されています」みたいに
エラーがでてしまいます。
どのように修正すれば、よいのでしょうか?
よろしくお願い致します。     

※全角になっているなどは、見やすくする為にやっています。

投稿日時 - 2002-12-14 02:00:37

QNo.427437

すぐに回答ほしいです

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

>この場合、Aのテーブルに対して外部結合をしていると言う
>表現になるのでしょうか??
その表現でいいと思います。

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

投稿日時 - 2002-12-16 10:10:34

お礼

またまた、ご回答ありがとうございます。
そして、返事が遅くなってすいません。

上記の書き方にてうまくいきました。
やっと、少しずつ理解できてきたように思います。
ありがとうございました。

投稿日時 - 2002-12-23 04:04:34

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

こんにちは。
No.2の方が詳しく書かれていますが、

要するに
「データが無くても、無理矢理くっつけたいテーブル」
のほうに対して「(+)」を指定すれば良いのです。

質問のところに書いてある構文だと、
逆になってしまっているのが原因ですね。

投稿日時 - 2002-12-17 15:10:34

お礼

ご回答ありがとうございます。

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

ありがとうございました。

投稿日時 - 2002-12-23 04:05:55

ANo.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';

で、外部結合できるはずです。

投稿日時 - 2002-12-14 16:07:42

お礼

ご回答ありがとうございます。

上記のようにすれば良いのですね。
勉強になります。

この場合、Aのテーブルに対して外部結合をしていると言う
表現になるのでしょうか??

まだ、外部結合について理解が乏しくて、このような質問で
申し訳ありません。本なんかを読んでいても外部結合について
なかなか理解できなくて・・。

よろしくお願い致します。

投稿日時 - 2002-12-14 16:54:45

ANo.1

>データを取得しいテーブルが4つあったとします。

A、B、Cの3つではないでしょうか。

>Aテーブルのキーは、「ユーザーID」と「名前」と「住所」だとします。
Bテーブルのキーは、「名前」と「郵便番号」とします。
Cテーブルのキーは、「名前」と「郵便番号」とします。

キーは各テーブルに共通したものとするのがよいのではないでしょうか。

>A.ユーザーID = ’XXXXX’,
     A.名前 = ’AAAAAA’,
     A.住所 = ’KKKKKKKKKKK’

これだと特定のレコードしか選ばれないのではないでしょうか。また、これらの条件の間に論理記号が必要ではないでしょうか。

投稿日時 - 2002-12-14 02:56:18

補足

すいません。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)は必ずデータとして、
帰ってきて欲しいと思っています。

このような場合に、どのように記述すればよいでしょうか??
よろしくお願い致します。

※わかりにくい点などありましたら、どんどんご指摘ください。

投稿日時 - 2002-12-14 03:02:18

あなたにオススメの質問