一つのカラムに1〜3個のIDが入っておりますが、JOINの仕方が分からないのでお教えいただけますか?
実際のテーブルが以下の表です。
また、想定している出力が下記の2つです。
もともとのbaseballclubというテーブルの出身小学校をコードから学校名に置換したいイメージです。
ご存知の方、SQLまたはヒントのご教示お願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/15 07:03
回答3件
0
ベストアンサー
データ内容から出身小学校は配列の様ですね。
配列は、**項目名[添字]**で参照できます。
SQL
1select club.名前,club.年齢, elmnt.学校名 2from baseballclub club 3 left join elementary elmnt 4 on club.出身小学校[1]=elmnt.コード
ただ、上記だと出身小学校
に出身小学校[1]
の式インデックスを追加しないと遅いかもしれません。
因みに、配列演算子を用いて結合した場合は、
SQL
1select club.名前,club.年齢, (array_agg(学校名))[1] as 学校名 2from baseballclub club 3 left join elementary elmnt 4 on club.出身小学校 @> array[elmnt.コード] 5group by club.名前,club.年齢
但し、学校名を出身小学校の1番目にするには以下の様にもう少し工夫が必要です。
SQL
1select club.名前, club.年齢, (array_agg(学校名 order by 並び))[1] 2from ( 3 select * 4 from baseballclub, unnest(出身小学校) with ordinality as w(出身小学校コード, 並び) 5 ) club 6 left join elementary elmnt 7 on club.出身小学校 @> array[elmnt.コード] 8group by club.名前, club.年齢
出身小学校が展開された形での取得は、
SQL
1select club.名前, club.年齢, elmnt.学校名 2from baseballclub club 3 left join elementary elmnt 4 on club.出身小学校 @> array[elmnt.コード]
投稿2019/03/15 07:27
編集2019/03/15 08:10総合スコア25138
0
3つまでと決まっているのであれば、baseballclubテーブルに「出身小学校1」「出身小学校2」「出身小学校3」をもたせる形にしてはどうでしょうか?
3つまでではなく、いくつ入るのか決まっていない場合は、「出身小学校テーブル」を作るべきですよね。
「名前」と「小学校コード」だけを持ったテーブル。
必要なら「シーケンス」とか「入学順」等の列も作って、どの順で小学校に所属していたのかを見れるようにしても。
そもそも、現状のデータの持たせ方は非常に良くないです。
投稿2019/03/15 06:40
総合スコア75
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/15 07:06
2019/03/15 07:10
2019/03/15 07:14
2019/03/15 07:35
2019/03/15 07:40
2019/03/15 12:08
2019/03/16 03:56
0
親の仕事により頻繁に引っ越す人もいます。出身小学校が4つ以上の人が入ってきたらどうしますか?
テーブルはデータベースの正規化 に沿って設計します。通常、第3正規化まで行います。第1正規化で繰り返し(今回は出身小学校)を排除します。
投稿2019/03/15 11:42
総合スコア16415
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/15 12:14
2019/03/15 12:28
2019/03/16 04:09 編集
2019/03/16 13:40
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。