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になるんでしょうか?
すいませんが、よろしくお願いします。
No.1ベストアンサー
- 回答日時:
>サブクエリを使うのか?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にするかは仕様を検討してください
ありがとうございます。
早速試してみます。
>それはデータの持ち方が悪いからです。
>普通はご提示のようなデータの持ち方にはなりません。
>areaはおそらくvarchar型が妥当ですが、yearやpayはint型がよいでしょう
>それをvalueという枠に押し込めるのは賢明ではありません
>正規化について学習をされたほうがよいでしょう
確かにその通りなんですが、既存DBがすでに運用中で、変えようがないのです。。。
困ったものです(>_<)
No.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'
ありがとうございます。
実は他にもいくつかのカラム、テーブルがあり
そちらの方でINNER JOINを使うので精いっぱいでした。
なのでWHEREでいけるのかな?と勝手に思い込んでおりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle sqlで質問です。 idを元にidに紐付くデータで住所コードがjpのみのデータ以外のidを取得したい 4 2023/03/20 17:41
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- MySQL mysqlの結合について教えてください 1 2022/05/19 15:13
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- Oracle sqlで質問です。 Aテーブルの登録番号をキーにBテーブルから確認番号を取得したいのですが、Bテーブ 4 2023/05/18 13:08
- MySQL 共通点はあります。何が違うのでしょうか? 1 2023/01/27 05:22
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQL Left Join で重複を排除す...
-
VIEWの元のテーブルのindexって...
-
SQLサーバから、項目の属性(型...
-
副問合せの書き方について
-
複数テーブルのGROUP BY の使い...
-
sqlで、600行あるテーブルを100...
-
上位3位を求めるSQL文は?
-
select文のwhere句に配列を入れ...
-
selectした大量データをinsert...
-
graphvizで到達矢印の位置を選...
-
テーブルが5つの時の結合の仕...
-
エクセルの関数について教えて...
-
MySQLのint型で001と表示する方...
-
HAVING count()で重複したデー...
-
順位の取得
-
SQLにて特定の文字を除いた検索...
-
insertを高速化させたい
-
min句のSQLを改造し二番目に小...
-
URL と行番号の指定
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQL Left Join で重複を排除す...
-
VIEWの元のテーブルのindexって...
-
SQLサーバから、項目の属性(型...
-
select文のwhere句に配列を入れ...
-
副問合せの書き方について
-
マイクラPC版のコマンドで効率...
-
Unionした最後にGROUP BYを追加...
-
selectした大量データをinsert...
-
SQLにて特定の文字を除いた検索...
-
[SQLServer] テーブル名からカ...
-
1テーブル&複数レコードの更新...
-
inner joinをすると数がおかし...
-
クエリ表示と、ADOで抽出したレ...
-
ある条件の最大値+1を初番する...
-
sqlで、600行あるテーブルを100...
-
複数テーブルのGROUP BY の使い...
-
insertを高速化させたい
-
PL/SQLの変数について
-
キー毎の、ある列のmaxのレコー...
おすすめ情報