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

解決済みの質問

3つの表の外部結合

表A、B、Cの3つがあり、Aのすべての行を出力したいと考えています。
外部結合を用いるのだとは思うのですが、3つの表に対して行う場合の
書き方がわからず困っています。
ご教授いただけないでしょうか?
select * from a,b,c
where a.商品ID =b.商品ID (+) and b.商品ID (+) =c.商品ID (+)
としてみましたが、うまくいきませんでした。

投稿日時 - 2006-12-28 11:23:11

QNo.2630383

困ってます

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

ansi構文の趣旨からいえば、結合条件と絞り込み条件は分けて書くので・・

select *
from a
left join b on (a.商品ID =b.商品ID)
left join c on (b.商品ID =c.商品ID)
where a.年月 = 任意の値

と書くのが一般的でしょうね。

投稿日時 - 2006-12-28 13:14:04

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

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

回答(3)

3表の外部結合自体は可能ですが、起点となる表を作らないと正しく結合できません。
select * from a,b,c
where a.商品ID =b.商品ID (+) and a.商品ID (+) =c.商品ID (+)
とすれば、結合できるはずです。

なお、9i以降のANSI構文であれば、正しく外部結合出来たと記憶しています。
select *
from a
left join b on (a.商品ID =b.商品ID)
left join c on (b.商品ID =c.商品ID)

投稿日時 - 2006-12-28 12:28:04

お礼

ありがとうございます。
select *
from a
left join b on (a.商品ID =b.商品ID)
left join c on (b.商品ID =c.商品ID)
でなんとか目的の結果を得られそうです。
更にこの後に続けて条件をつけたいのですが、
~ left join c on (b.商品ID =c.商品ID) and
a.年月 = 任意の値 とすれば良いのでしょうか?

投稿日時 - 2006-12-28 12:32:17

ANo.1

DBエンジンにより異なるかもしれませんが、確かOracleでは素直な方法でこのような事は出来なかったと思います。

例えば、副問い合わせを使ってこのようなやり方はどうでしょうか。
試してないので間違ってたらすみません....

select *
from a, (select * from b, c where b.商品ID = c.商品ID (+)) as ab
where a.商品ID = b.商品ID (+)

投稿日時 - 2006-12-28 11:27:59