dポイントプレゼントキャンペーン実施中!

oracleからSQL Serverへ移行することになったのですが、副問い合わせで定義したテーブル同士を外部結合するSQL構文が、うまく実現できず、ご教授して頂きたくよろしくお願いします。

下記、oracle 構文をSQL Server構文へ書き換えたい。

select *
from
(select cal1,cal2,cal3 from tbl1,tbl2 where cal1 >100) aaa,
(select cal1,cal2,cal3 from tbl1,tbl2 where cal1 <=100) bbb,
tbl3
where
aaa.cal1 = bbb.cal1(+) and
aaa.cal2 = bbb.cal2(+) and
aaa.cal3 = bbb.cal3(+) and
aaa.cal1 = tbl3.cal1

よろしくお願いします。

A 回答 (3件)

>副問い合わせ同士のキーが複数になるどうしたらいいのでしょうか。


>すみません。よろしくお願いします。

where と同様、join~on に対しても and で複数条件をつなげる事ができます。

select *
from
(select cal1,cal2,cal3 from tbl1,tbl2 where cal1>100) aaa
right join
(select cal1,cal2,cal3 from tbl1,tbl2 where cal1<=100) bbb
on aaa.cal1 = bbb.cal1
and aaa.cal2 = bbb.cal2
and aaa.cal3 = bbb.cal3
where
aaa.cal1 = tbl3.cal1

※未検証です
    • good
    • 0
この回答へのお礼

なるほど、from句にカラムの結合を定義できるんですか。
知りませんでした。
ありがとうございました。
試してみます。

お礼日時:2011/10/17 09:24

oracleの(+)は外部結合の右側、right joinの左側を意味します。


なので
select *
from
(select cal1,cal2,cal3 from tbl1,tbl2 where cal1 >100) aaa
left join
(select cal1,cal2,cal3 from tbl1,tbl2 where cal1 <=100) bbb
on aaa.cal1 = bbb.cal1 and
aaa.cal2 = bbb.cal2 and
aaa.cal3 = bbb.cal3
inner join
tbl3
on aaa.cal1 = tbl3.cal1

かな。ただし、元データが同じで「cal1 >100」と「cal1 <=100」では「cal1」が100でないと「bbb」側はすべてNULLになるのですがいいのでしょうか?
    • good
    • 0
この回答へのお礼

ありがとうございました。
勉強になりました。

指摘どおり例が悪かったですね。

お礼日時:2011/10/17 09:29

ぱっと見た感じ、外部結合演算子「(+)」をLeft Outer Join構文に書き換えればよいのでは。



http://www.google.co.jp/url?sa=t&source=web&cd=7 …

この回答への補足

早々に回答ありがとうございます
説明不足で申し訳ありません。

こちらの確認したい主旨は、Oracleでは外部結合の定義をWhere句で行うところ、SQL Serverは
From句で定義するため、副問い合わせでは定義がうまくいきません。
外部結合キーが一つであれば下のようになりますが、

select *
from
(select cal1,cal2,cal3 from tbl1,tbl2 where cal1>100) aaa
right join
(select cal1,cal2,cal3 from tbl1,tbl2 where cal1<=100) bbb
on aaa.cal1=bbb.cal1
where
aaa.cal1 = tbl3.cal1

副問い合わせ同士のキーが複数になるどうしたらいいのでしょうか。
すみません。よろしくお願いします。

補足日時:2011/10/16 10:59
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!