人気ブログランキング | 話題のタグを見る
(SQL)SQLで区分などの複数の意味を持たせてるテーブルを何回も結合する方法
ちょっと題名の意味がわけわかめですが、つまりまあこういうことです。
データベースで区分とか設定情報とかは意味が異なったとしても1つのテーブルにまとめることが多いと思います。
下記は区分の名称を1つのテーブルでもたした例です。
"SettingDiv"列が区分IDで、"SettingID"列が各区分毎のデータを識別するIDです。
テーブル名は "Setting" とします。
ここで血液型区分が 1, 性別区分が 2, 職業区分が 3 と決めています。
┌─────┬─────┬────┐
│SettingDiv│SettingID │Contents│
├─────┼─────┼────┤
│1 │1 │A型 │
├─────┼─────┼────┤
│1 │2 │B型 │
├─────┼─────┼────┤
│1 │3 │O型 │
├─────┼─────┼────┤
│1 │4 │AB型 │
├─────┼─────┼────┤
│2 │1 │男性 │
├─────┼─────┼────┤
│2 │2 │女性 │
├─────┼─────┼────┤
│3 │1 │会社員 │
├─────┼─────┼────┤
│3 │2 │ニート │
├─────┼─────┼────┤
│3 │3 │自営業 │
├─────┼─────┼────┤
│3 │4 │学生 │
└─────┴─────┴────┘

これとは別に"Customer"テーブルがあり、各設定項目が設定テーブルのSettingと結びついています。
┌─┬──────┬─────┬──┬──┐
│ID│CustomerName│BloodType │Sex │Job │
├─┼──────┼─────┼──┼──┤
│1 │テスト1 │2 │1 │1 │
├─┼──────┼─────┼──┼──┤
│2 │テスト2 │ │2 │2 │
├─┼──────┼─────┼──┼──┤
│3 │テスト3 │3 │2 │ │
└─┴──────┴─────┴──┴──┘

で、下記のような出力を出すようなSQLを書きたいのです。
┌─┬──────┬─────┬───────────┬──┬────────┬──┬────────┐
│ID│CustomerName│BloodType │BloodTypeText.Contents│Sex │SexText.Contents│Job │JobText.Contents│
├─┼──────┼─────┼───────────┼──┼────────┼──┼────────┤
│1 │テスト1 │2 │B型 │1 │男性 │1 │会社員 │
├─┼──────┼─────┼───────────┼──┼────────┼──┼────────┤
│2 │テスト2 │ │ │2 │女性 │2 │ニート │
├─┼──────┼─────┼───────────┼──┼────────┼──┼────────┤
│3 │テスト3 │3 │O型 │2 │女性 │ │ │
└─┴──────┴─────┴───────────┴──┴────────┴──┴────────┘

要は、Costomerテーブルと複数の区分を持たせてあるSettingテーブルを結合したいわけです。
そして、Customerの各区分の値がnullでも結合させます。

で、この結果を出すにはSQLには下記のように結合すればいいみたいです。

SELECT Customer.ID ,
Customer.CustomerName ,
Customer.BloodType ,
BloodTypeText.Contents ,
Customer.Sex ,
SexText.Contents ,
Customer.Job ,
JobText.Contents
FROM Customer
LEFT OUTER JOIN Setting BloodTypeText
ON Customer.BloodType = BloodTypeText.SettingID
AND Customer.SettingDiv = 1
LEFT OUTER JOIN Setting SexText
ON Customer.Sex = SexText.SettingID
AND Customer.SettingDiv = 2
LEFT OUTER JOIN Setting JobText
ON Customer.Job = JobText.SettingID
AND Customer.SettingDiv = 3

LEFT OUTER JOINでSettingテーブルを区分回数分結合します。
区分はリテラルとして、結合条件に記述します。
by jehoshaphat | 2008-11-29 19:37 | SQL


<< (SQL)Accessでは結合... (.Net)DataGridV... >>