こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

複数行の結果を一行でSELECTするには

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になるんでしょうか?

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

投稿日時 - 2012-03-10 23:49:30

QNo.7354848

困ってます

質問者が選んだベストアンサー

>サブクエリを使うのか?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にするかは仕様を検討してください

投稿日時 - 2012-03-11 01:28:03

お礼

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

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

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

投稿日時 - 2012-03-11 10:51:27

ANo.1

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

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

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'

投稿日時 - 2012-03-11 11:04:24

お礼

ありがとうございます。

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

投稿日時 - 2012-03-11 22:40:05

あなたにオススメの質問