3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(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テーブルを区分回数分結合します。
区分はリテラルとして、結合条件に記述します。