- 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) より:
皆様、丁寧にコードまで書いて頂きありがとうございました。
無事、テーブル結合ができました。
大量のデータを作って、レスポンスの良い物を採用しようと思います。
|
そのやりかたに反対はしませんが、実行計画を取得すればより一層明示的にわかります
|