- PR -

SQL Server テーブル結合の質問

1
投稿者投稿内容
PiKaPiKa
会議室デビュー日: 2005/09/05
投稿数: 19
投稿日時: 2008-04-23 00:46
只今、SQL Serverを使って開発を行っています。

結合の仕方での質問なんですが、区分により3つの結合条件があるのですが、結果は一回で取得したいと思っています。取得する項目数は同じです。

状態は以下の通りです。

テーブルA、テーブルBがあります。
テーブルAの項目数30、テーブルBの項目数15。
これを、テーブルA LEFT ARTER JOIN テーブルB ON (条件)で結合します。
この条件なのですが、テーブルAの項目1が0の場合は
テーブルA.項目2 = テーブルB.項目2 AND
テーブルA.項目3 = テーブルB.項目3 で結合します。
テーブルAの項目1が1の場合は
テーブルA.項目2 = テーブルB.項目2 AND
テーブルA.項目3 = テーブルB.項目3 AND
テーブルA.項目4 = テーブルB.項目4 で結合します。
テーブルAの項目1が2の場合は
テーブルA.項目2 = テーブルB.項目2 AND
テーブルA.項目3 = テーブルB.項目3 AND
テーブルA.項目4 = テーブルB.項目4 AND
テーブルA.項目5 = テーブルB.項目5 で結合します。
上記のように結合条件が3つ必要なのですが、これを1回で取得する方法がわかりません。
今はSELECT文を3個書き、UNIONで結果を合体させてますが、他にいい方法がないかと思い質問しました。

皆様の知恵を貸して頂けたら嬉しいです。宜しくお願いします。






七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2008-04-23 01:20
UNIONを使うのが最もスタンダートと思います。


saki1208
ベテラン
会議室デビュー日: 2006/08/22
投稿数: 86
投稿日時: 2008-04-23 03:28
saki1208です。

join句で項目1の条件ごとに結合すれば可能ではないでしょうか。

コード:

SELECT *
FROM テーブルA A
LEFT JOIN テーブルB B0
ON A.項目1 = 0
AND B0.項目2 = A.項目2
AND B0.項目3 = A.項目3
LEFT JOIN テーブルB B1
ON A.項目1 = 1
AND B1.項目2 = A.項目2
AND B1.項目3 = A.項目3
AND B1.項目4 = A.項目4
LEFT JOIN テーブルB B2
ON A.項目1 = 2
AND B1.項目2 = A.項目2
AND B1.項目3 = A.項目3
AND B1.項目4 = A.項目4
AND B1.項目5 = A.項目5



普段はOracleばかりなので、このままでOKかはわかりません。
特にカッコとか...
※検証はしてません。

サブクエリの意味がなかったので編集。

[ メッセージ編集済み 編集者: saki1208 編集日時 2008-04-23 03:31 ]
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2008-04-23 08:57
コード:
テーブルA LEFT JOIN テーブルB ON
  テーブルA.項目2 = テーブルB.項目2 AND 
  テーブルA.項目3 = テーブルB.項目3 AND 
  テーブルA.項目4 = (case when テーブルA.項目1=0 then テーブルA.項目4 else テーブルB.項目4 end) AND 
  テーブルA.項目5 = (case when テーブルA.項目1=2 then テーブルB.項目5 else テーブルA.項目5 end)

テーブルA.項目1が0,1,2以外もある場合などはちょっと変わります。
どの方法でもいいと思います。結果が期待しているものかと、速さを見て決めればいいと思います。
よっしー
大ベテラン
会議室デビュー日: 2007/05/17
投稿数: 143
投稿日時: 2008-04-23 10:45
引用:

PiKaPiKaさんの書き込み (2008-04-23 00:46) より:
この条件なのですが、テーブルAの項目1が0の場合は
テーブルA.項目2 = テーブルB.項目2 AND
テーブルA.項目3 = テーブルB.項目3 で結合します。
テーブルAの項目1が1の場合は
テーブルA.項目2 = テーブルB.項目2 AND
テーブルA.項目3 = テーブルB.項目3 AND
テーブルA.項目4 = テーブルB.項目4 で結合します。
テーブルAの項目1が2の場合は
テーブルA.項目2 = テーブルB.項目2 AND
テーブルA.項目3 = テーブルB.項目3 AND
テーブルA.項目4 = テーブルB.項目4 AND
テーブルA.項目5 = テーブルB.項目5 で結合します。



やり方は、いくつもあってパフォーマンスによって使い分ければよいですが、
ここまで条件が分かっているなら、単純にORで結んでも出ます。

コード:
LEFT OUTER JOIN テーブルB ON
    テーブルAの項目1 = 0 AND 
    テーブルA.項目2 = テーブルB.項目2 AND 
    テーブルA.項目3 = テーブルB.項目3
)
OR
(
    テーブルAの項目1 = 1 AND 
    テーブルA.項目2 = テーブルB.項目2 AND 
    テーブルA.項目3 = テーブルB.項目3 AND 
    テーブルA.項目4 = テーブルB.項目4
)
OR
(
    テーブルAの項目1 = 2 AND 
    テーブルA.項目2 = テーブルB.項目2 AND 
    テーブルA.項目3 = テーブルB.項目3 AND 
    テーブルA.項目4 = テーブルB.項目4 AND 
    テーブルA.項目5 = テーブルB.項目5
)



PiKaPiKa
会議室デビュー日: 2005/09/05
投稿数: 19
投稿日時: 2008-04-23 21:56
皆様、丁寧にコードまで書いて頂きありがとうございました。
無事、テーブル結合ができました。
大量のデータを作って、レスポンスの良い物を採用しようと思います。
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2008-04-23 22:46
引用:

PiKaPiKaさんの書き込み (2008-04-23 21:56) より:
皆様、丁寧にコードまで書いて頂きありがとうございました。
無事、テーブル結合ができました。
大量のデータを作って、レスポンスの良い物を採用しようと思います。



そのやりかたに反対はしませんが、実行計画を取得すればより一層明示的にわかります

1

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