プロが教える店舗&オフィスのセキュリティ対策術

2つのテーブルからデータを取得します。
FKがstaff_idになります。

●staff_tbl
staff_id staff_name staff_group
1     田中     A 
2     鈴木     A
3     森田     B

●value_tbl
staff_id value_name value
1     area     大阪
1     year      5
1     pay      1000
2     area     奈良
2     year      2
2     pay      900

テーブルのサンプルはこのようなイメージです。

結果を下記のように取得したいのですが。。。
1 田中 A 大阪  5 1000
2 鈴木 A 奈良  2 900

サブクエリを使うのか?TOを使うのか、ググって何度か試したけども
いまいちわかりませんでした。
どのようなSQLになるんでしょうか?

すいませんが、よろしくお願いします。

A 回答 (2件)

>サブクエリを使うのか?TOを使うのか、ググって何度か試したけども


>いまいちわかりませんでした。

それはデータの持ち方が悪いからです。
普通はご提示のようなデータの持ち方にはなりません。
areaはおそらくvarchar型が妥当ですが、yearやpayはint型がよいでしょう
それをvalueという枠に押し込めるのは賢明ではありません
正規化について学習をされたほうがよいでしょう。

ちなみに今回の例示で実現するなら以下のようにすると良いでしょう。

select s.staff_id,staff_name,staff_group
,v1.value as area
,v2.value as year
,v3.value as pay
from staff_tbl as s
left join value_tbl as v1 on s.staff_id=v1.staff_id and v1.value_name='area'
left join value_tbl as v2 on s.staff_id=v2.staff_id and v2.value_name='year'
left join value_tbl as v3 on s.staff_id=v3.staff_id and v3.value_name='pay'

left join にするかinner joinにするかは仕様を検討してください
    • good
    • 0
この回答へのお礼

ありがとうございます。
早速試してみます。

>それはデータの持ち方が悪いからです。
>普通はご提示のようなデータの持ち方にはなりません。
>areaはおそらくvarchar型が妥当ですが、yearやpayはint型がよいでしょう
>それをvalueという枠に押し込めるのは賢明ではありません
>正規化について学習をされたほうがよいでしょう

確かにその通りなんですが、既存DBがすでに運用中で、変えようがないのです。。。
困ったものです(>_<)

お礼日時:2012/03/11 10:51

普通の結合でいいのでは?



select A.staff_id,A.staff_name,A.staff_group
,B.value,C.value,D.value from ((staff_tbl A
inner join staff_value B ON A.staff_id=B.staff_id
AND B.value_name='area')
inner join staff_value C ON A.staff_id=C.staff_id
AND C.value_name='year')
inner join staff_value D ON A.staff_id=D.staff_id
AND D.value_name='pay'
    • good
    • 0
この回答へのお礼

ありがとうございます。

実は他にもいくつかのカラム、テーブルがあり
そちらの方でINNER JOINを使うので精いっぱいでした。
なのでWHEREでいけるのかな?と勝手に思い込んでおりました。

お礼日時:2012/03/11 22:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!