質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

2回答

1036閲覧

SQLにおいて2段先のデータを選択する

toto654

総合スコア39

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

1クリップ

投稿2019/01/23 16:16

###実現したいこと
イメージ説明

・選手テーブル・スポーツテーブル・ポジションテーブルを用意します。

・選手テーブル カラム(id,name,sport,position)

・スポーツテーブル カラム(id,name)

・ポジションテーブル カラム(id,name)とします。

選手テーブルにデータを追加するとき
選手名を書き、スポーツをスポーツテーブルから選び(関連付けしてそこからしか選べないようにする)、そしてそのスポーツに関連したポジションをポジションテーブルから選ぶ(関連しそこから選ぶ)。

**これはSQLだけの操作で出来ますか?

###2パターンでデータを追加する方法を知りたいです。

1.これは上記に書きました方法です。

2.
・選手テーブル カラム(id,name,sport,position)

・スポーツテーブル カラム(id,name,position)<-positionを追加しました。

・ポジションテーブル カラム(id,name)とします。

選手テーブルにデータを追加するとき
選手を書き、スポーツをスポーツテーブルから選び(関連付け)、そしてそのスポーツに関連したポジションをポジションテーブルから関連付けしてあったスポーツテーブルのpositionからpositionを選択する。

1と違う点はpositionをスポーツテーブルのpositionから取得するところです。

こちらも同様にSQLだけで操作できますか?

ご教授の程よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

選手名を書き、スポーツをスポーツテーブルから選び(関連付けしてそこからしか選べないようにする)、そしてそのスポーツに関連したポジションをポジションテーブルから選ぶ(関連しそこから選ぶ)。

**これはSQLだけの操作で出来ますか?

選ぶという行為はSQLにできませんが、選ぶための選択肢の情報をSQLにて問い合わせるという事は可能です。

スポーツにポジションの外部参照を設定するという事は、ポジションがまず登録されている必要があります。
普通はスポーツを登録してそのスポーツのポジションを登録するという事かと思いますけど。
なので、以下ではないかと。
・ポジションテーブル カラム(id, name, sports)
・スポーツテーブル カラム(id, name)
追記)よく見ると画像で上記構造を示していますね。

・選手テーブル カラム(id,name,sport,position)
選手テーブルについては、potitionはsportが限定された状態であるので、特に問題ないと思います
但し、選手が複数のスポーツに関与しない前提です。
複数のスポーツに関与する場合は、(player, sports)のようなテーブルが必要です。

投稿2019/01/24 02:10

編集2019/01/24 05:51
sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toto654

2019/01/24 13:26

回答ありがとうございます。そっちのやり方が適しているみたいなので、そちらで考えて行きたいと思います。
guest

0

ベストアンサー

すみません。正直なところ、状況と何が聞きたいのかが今ひとつ汲み取れません。

なのでエスパー回答(あまり良くないんですが)になります。

DBの正規化の話になりますが、スポーツテーブルにポジション入れるならポジションテーブルは不要です。選手テーブルにもポジションカラムは不要です。

ただ、「どのように使いたいか」という話になります。
通常想像されるのは、下記のような流れかなと。
0. 名前を入力する
0. スポーツを選択する
0. そのスポーツに対応したポジションを選択する

となると自然と親子関係も決まってきます。
「スポーツ」が親で「ポジション」が子です。
となると「そのスポーツに属するポジション」になってくるかと思います。
上記の2,3を自然に成り立たせるには「ポジションテーブルにスポーツIDカラムを追加」ではないでしょうか。

スポーツによってポジションは違ってきます。
ポジションとは「役割」です。
例え同じ名称のポジションが別スポーツにあったとしても役割まで全く一緒とは限りません。
となると、ポジションテーブルにスポーツIDがあるのが自然だと思います。
なので1のままでいいのではと。

**これはSQLだけの操作で出来ますか?

これが2度書いてありますがちょっと意味が分からないですね。

「書く」「選ぶ」などのアクション(イベント)があるようですが、
それがいったいどこからのアクションなのか明示されていません。
SQLは結局のところそのアクションを元にDBに問い合わせしにいくだけなので、アクションの出所(トリガー)がないと回答しようがありません。
(まあとはいってもそこから実行するように組んでね、くらいのものですが)

テーブルが別であれば「追加する」という行為(INSERT)も別々にする必要があります。
それぞれのIDをつける必要があると思うので、つけたIDをもって外部キー制約があるテーブルにINSERTしにいく感じですね。
LASTVAL()とかは使えると思いますが、プログラムによってはlastInsertIdのような機能もあるし、もしシーケンスでつけているなら親テーブルのid生成で使ったNEXTVAL()を使えば良いです。

2が何をしたいのか分かりません。
ポジションテーブル意味ないように思います。

できますか?

可不可だけを聞かれてますよね。
「できます」
(付け足すなら「あとは自分の要件をきちんと整理して調べてやってみてください」)

この質問内容だけではこれくらいまでではないでしょうか。

※あとすごく細かいですが「床みがき」「ころがし」というポジションは存在しません。状況からカーリングかと思いますが、結構細かく分かれています
さすがに失礼なのでどうせ挙げるなら正確な名称を使ってください。

投稿2019/01/24 00:59

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toto654

2019/01/24 13:24

回答ありがとうございます。的確な質問理解と回答感謝します。1で考えてみたいと思います。また、次の質問までにカーリングの知識も"URL"で確認し覚えたいと思います。orz
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問