6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

1対多 関係から多の結果を1レコード別カラムに返すSQL(上限有り前提)

6
Posted at

1対多 関係から多の結果を1レコード別カラムに返すSQL(上限有り前提)

  • select結果を普通縦にレコードが伸びますが横に伸ばしたいときに利用できます。
  • crosstabとか利用するのが面倒なときにエイヤッと書けます。

テーブル例

  • 1:membersテーブル
  • 多:member_hobbies テーブル
  • 1人が複数の趣味を持っている

説明

  • 普通にJOINすると右表のように返ってくる
    説明

返したい結果表

  • 一人ごとに複数有る趣味を横に伸ばして返したい
    説明

SQL (どちらも同じ結果が返ります)

シンプルSQL

  • 伸ばしたいカラム数分、SELECT句に副問合せを記述
select
( SELECT member_hobbies.name
           FROM member_hobbies
          WHERE member_hobbies.fda_member_id = fda_members.id
     ORDER BY member_hobbies.id
         OFFSET 0
         LIMIT 1 ) AS hobby_1,
( SELECT member_hobbies.name
           FROM member_hobbies
          WHERE member_hobbies.fda_member_id = fda_members.id
     ORDER BY member_hobbies.id
         OFFSET 1
         LIMIT 1) AS hobby_2,
( SELECT member_hobbies.name
           FROM member_hobbies
          WHERE member_hobbies.fda_member_id = fda_members.id
     ORDER BY member_hobbies.id
         OFFSET 2
         LIMIT 1) AS hobby_3,
( SELECT member_hobbies.name
           FROM member_hobbies
          WHERE member_hobbies.fda_member_id = fda_members.id
     ORDER BY member_hobbies.id
         OFFSET 3
         LIMIT 1) AS hobby_4,
     *
FROM
     members


配列利用SQL

  • FROM句にて副問合せで、人ごとに趣味を配列化して保持する
  • 伸ばしたいカラム数分、SELECT句に配列を指定する
--SQLがすっきりする。
--副問合せが一回で済み速度も速くなる可能性有り
--WHERE句が書きやすい
--SELECT句に指定が必要
select    
     hobby[1] as hobby1,
     hobby[2] as hobby2,
     hobby[3] as hobby3,
     hobby[4] as hobby4,
     hoge.*
FROM
     (
     select
          *,
          (
               select ARRAY ( select name FROM member_hobbies where fda_member_id = members.id ORDER BY id)
          ) as hobby
     FROM
          members
     ) as hoge

6
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?