- PR -

SQLの構文

投稿者投稿内容
のの
ベテラン
会議室デビュー日: 2004/11/10
投稿数: 88
投稿日時: 2005-08-18 10:16
毎度。

SQLServerのView(SQL)で教えて下さい。

あるテーブルAがあり、X・Y・Zの3列で構成されているとします。

この時、列Yの値が、、、

”1”の時、テーブルBと、列Zの値をキーとしてLeftJoinする。
”2”の時、テーブルCと、列Zの値をキーとしてLeftJoinする。
”3”の時、テーブルDと、列Zの値をキーとしてLeftJoinする。

といったことをView(SQL)で表現することは可能でしょうか?

よろしくお願いします。

追伸)SQLServer2003です。
でっち6号
大ベテラン
会議室デビュー日: 2005/01/31
投稿数: 176
お住まい・勤務地: Kawasaki
投稿日時: 2005-08-18 10:38
こんにちは。

テーブルAのY列を条件としてWhere句に書いた3つのSQLを、
UNIONで繋げればOKだと思います。
カラムを合わせることに注意して下さい。

[ メッセージ編集済み 編集者: でっち6号 編集日時 2005-08-18 10:39 ]

あ、NAOさんがこのスレageておいてくれてますね。
参考になるので、ぜひご一読下さい。

UNIONの詳しい使い方は、
えんぞ@?さんの書かれているリンクから、
@ITデータベース入門→SQL実践講座→第9回 SELECT文を統合するUNION
を辿って参照して下さい。

[ メッセージ編集済み 編集者: でっち6号 編集日時 2005-08-18 11:32 ]
明智重蔵
大ベテラン
会議室デビュー日: 2005/09/05
投稿数: 127
投稿日時: 2005-09-05 15:44
case式による多分岐を使用すればいいかと思われます

くわしくはこちらを参照して下さい
http://oraclesqlpuzzle.hp.infoseek.co.jp/4-5.html

[ メッセージ編集済み 編集者: 重蔵 編集日時 2005-09-05 16:39 ]

[ メッセージ編集済み 編集者: 重蔵 編集日時 2005-09-22 10:50 ]
とんくま
ベテラン
会議室デビュー日: 2005/08/02
投稿数: 56
お住まい・勤務地: 東京
投稿日時: 2005-09-05 19:37
もしかしたら、とんでもない勘違いをしているかもしれないので、その場合はお許し下さい。

どの方法(case, decode, union)を使ったとしても、例えばY=1の時次のSELECT結果が複数行になった場合、うまくいきますか?

(select b.val1 from テーブルB b where b.Z=a.Z)


これらの方法は、以下のように「UNIQUE列」という追加条件がある場合にだけ使えるように思います。
”1”の時、テーブルB のUNIQUE列 と、列Zの値をキーとしてLeftJoinする。
”2”の時、テーブルC のUNIQUE列 と、列Zの値をキーとしてLeftJoinする。
”3”の時、テーブルD のUNIQUE列 と、列Zの値をキーとしてLeftJoinする。
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-09-05 20:10
多分、どの方法を使った場合でも単一値を返すサブクエリを使うわけでもないため、特に uniqueness は不要だと思います。
明智重蔵
大ベテラン
会議室デビュー日: 2005/09/05
投稿数: 127
投稿日時: 2005-09-06 11:42
スカラー問い合わせで2行返すとエラーとなるため
caseとdecodeは1対1もしくは、多対1の場合にしか使えません

unionは1対1、1対多、多対1、多対多いずれの場合でも使えます


[ メッセージ編集済み 編集者: 重蔵 編集日時 2005-09-06 13:08 ]
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-09-06 12:45
left join の条件にcase あるいは decode をつかうのでは?
とんくま
ベテラン
会議室デビュー日: 2005/08/02
投稿数: 56
お住まい・勤務地: 東京
投稿日時: 2005-09-06 21:48
重蔵さん、
> くわしくはこちらを参照して下さい
> http://oraclesqlpuzzle.hp.infoseek.co.jp/4-6.html
を参照するとUNIONの場合も、
select Y,Z,
(select b.val1 from テーブルB b where b.Z = a.Z) as val1
from テーブルA a
where Y=1
union .......
.......
とスカラー問い合わせを使っているので、1対1もしくは、多対1の場合にしか使えないのではないでしょうか?
 

スキルアップ/キャリアアップ(JOB@IT)