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

解決済みの質問

oracleからSQL Serverへの移行

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

よろしくお願いします。

投稿日時 - 2011-10-16 02:40:57

QNo.7074388

すぐに回答ほしいです

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

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

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

※未検証です

投稿日時 - 2011-10-16 13:07:58

お礼

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

投稿日時 - 2011-10-17 09:24:29

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

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

回答(3)

ANo.3

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になるのですがいいのでしょうか?

投稿日時 - 2011-10-16 17:05:54

お礼

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

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

投稿日時 - 2011-10-17 09:29:00

ANo.1

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

http://www.google.co.jp/url?sa=t&source=web&cd=7&ved=0CFQQFjAG&url=http%3A%2F%2Ftechnet.microsoft.com%2Fja-jp%2Flibrary%2Fdd314438.aspx&ei=R_-ZTq6jEqOemQXJ-umLAg&usg=AFQjCNE-NVNrPFVdOPee230FZJZLQwgNhA

投稿日時 - 2011-10-16 06:48:37

補足

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

こちらの確認したい主旨は、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:33

あなたにオススメの質問