0

スキーマは画像をクリック

私が持っているスキーマに基づいてビューを構築しようとしています。しかし今、私はどこから始めればよいか完全に迷っています。私のビューは、プレーヤーの(リンクしている)保護者、保護者の電話番号、現在プレーしているチームに関する情報で構成されている必要があります。誰かが正しい道にたどり着くのを手伝ってくれたら本当にありがたいです。添付画像はリンク先をご覧ください

ありがとう!

Im hoping for this kind of result

 +----------+--------------+-------------+----------+-----------+-----------+------------+
|guardianID|guardian.fName|guardianlName|Contact   |playerfName|playerlName|teamName    |
+----------+--------------+-------------+----------+------------+-----------+-----------+
|        1 |Dora          | Kruger      |0288235556|Daphne     |Kruger     |Taeiri Eels |
|        2 |Tonia         | Wesley      |0204156513|Brigitta   |Wesley     |Southern Mag|
|        3 |Shanene       | Genovese    |0211915599|Stefan     |Genovese   |Kaikorai    |
|        4 |Jacob         | Jefferson   |0282316812|Yvonne     |Jefferson  |Pirate Skull|
|        5 |Tamika        | Longstaff   |0264217492|Todd       |Longstaff  |Zingari     |
+----------+--------------+------------+-----------+-----------+-----------+------------+

私はこれらの次のデータを持っています

====PERSON TABLE====
+----------+--------------+-------------+----------+-----------+
|personID  |firstName     |lastName     |addressID |photo      |
+----------+--------------+-------------+----------+-----------+
|        1 |Dora          | Kruger      |1         |NULL       |
|        2 |Daphne        | Kruger      |2         |NULL       |
|        3 |Tonia         | Wesley      |3         |NULL       |
|        4 |Brigitta      | Wesley      |4         |NULL       |
|        5 |Shanene       | Genovese    |5         |NULL       |
|        6 |Stefan        | Genovese    |6         |NULL       |
|        7 |Jacob         | Jefferson   |7         |NULL       |
|        8 |Yvibbe        | Jefferson   |8         |NULL       |
|        9 |Tamika        | Longstaff   |9         |NULL       |
|        10|Todd          | Longstaff   |10        |NULL       |
+----------+--------------+------------+-----------+-----------+    


====PHONE TABLE====
+----------+--------------+
|phoneID   |primaryContact|
+----------+--------------+
|        1 |0288235556    |
|        2 |0204156513    |
|        3 |0211915599    |
|        4 |0282316812    |
|        5 |0264217492    |
+----------+--------------+

====GUARDIAN TABLE====
+----------+--------------+-------------+----------+
|guardianID|personID      |phoneID      |email     |
+----------+--------------+-------------+----------+
|        1 |  1           | 1           |@ya.com   |
|        2 |  3           | 2           |@yy.com   |
|        3 |  5           | 3           |@ll.com   |
|        4 |  7           | 4           |@pp.com   |
|        5 |  9           | 5           |@no.com   |
+----------+--------------+------------+-----------+    

====PLAYER TABLE====
+----------+--------------+-------------+--------------+
|playerId  |personID      |schoolID     |dob           |
+----------+--------------+-------------+--------------+
|        1 |  2           | 1           |2008-04-06    |
|        2 |  4           | 2           |2011-11-19    |
|        3 |  6           | 3           |2011-01-07    |
|        4 |  8           | 4           |2006-01-01    |
|        5 |  10          | 5           |2004-04-06    |
+----------+--------------+-------------+--------------+


    ====FAMILY TABLE====
+----------+--------------+
|playerID   |guardianID    |
+----------+--------------+
|        1 |1             |
|        2 |2             |
|        3 |3             |
|        4 |4             |
|        5 |5             |
+----------+--------------+


====TEAM TABLE====
+----------+------------------+-------------+--------------+--------------+
|teamID    |teamName          |year         |minAge        |maxAge        |
+----------+------------------+-------------+--------------+--------------+
|        1 |  Taieri Eels     | 2015-01-01  |5             |6             |
|        2 |  Southern Magpies| 2014-01-01  |7             |8             |
|        3 |  Kaikorai        | 2016-01-01  |7             |10            |
|        4 |  Pirate Skulls   | 2014-01-01  |11            |12            |
|        5 |  Zingari         | 2013-01-01  |12            |16            |
+----------+------------------+-------------+--------------+--------------+


    ====TEAM ALLOCATION TABLE====  // allocating team for each player
+----------+--------------+
|teamID    |playerID      |
+----------+--------------+
|        2 |1             |
|        5 |2             |
|        1 |3             |
|        3 |4             |
|        4 |5             |
+----------+--------------+

更新: ガーディアン テーブルは、プレイヤーのガーディアンを識別するためのものです。関係は多対多であるため、ファミリー テーブルを使用してプレイヤーとその保護者をリンクしようとしていました。ただし、クエリを記述しようとして苦労しています。私はそれが3つのテーブル結合であり、エイリアスを使用すると思っていましたか? しかし、私はそれを機能させることができません。

SELECT p1.firstName AS guardianFName, p1.lastName AS guardianLName,
p2.firstName AS playerFName, p2.lastName AS playerLName
from person AS p1, person as p2
join guardian on
person.personID = guardian.personID join
family on guardian.guardianID = family.guardianID
join player on 
person.personID = player.personID join
family on player.playerID = family.playerID;

私はこのようないくつかのバリエーションを試しました

DDL および DML スクリプトはhttp://pastebin.com/euVanc2eにあります。これは、私たちが持っているデータでクエリをテストするのを手伝いたい人のためにあります。

4

1 に答える 1

1

スキーマを正規化すると、物事が大幅に簡素化されますが、それは別の質問として扱うのが最善です。

必要なような複雑な結合を作成する最善の方法は、単純な結合から作成し、各ステップでテストして正しい方向に進んでいることを確認することです。この場合、経験の浅い開発者にとって唯一の真の障害は、person2 回参加する必要があることです。これは、テーブル エイリアスを使用して対処できます。

分解してみましょう。

もちろん、最初のステップは に参加guardianpersonて保護者の名前を取得することです。

SELECT g.guardianId AS guardianId,
       p1.firstName AS guardianFName, p1.lastName AS guardianLName
  FROM guardian g
  INNER JOIN person p1
    ON g.personId = p1.personId;

単純に as ではなく asとしてエイリアシングpersonを行う理由は、すぐに明らかになります。p1p

次に、 と で同じことを行いplayerpersonプレイヤーの名前を取得します。

SELECT pr.playerId AS playerId,
       p2.firstName AS playerFName, p2.lastName AS playerLName
  FROM player pr
  INNER JOIN person p2
    ON pr.personId = p2.personId;

繰り返しますが、単に ではなくpersonasにエイリアスを付けました。最後のクエリでは列は表示されません。ここにあるのは、説明のためだけです。p2pplayerId

次に、ガーディアンの名前をプレイヤーの名前と一致させたいと思います。これは、結果の各行に対して、から2行を読み取る必要があることを意味しpersonます。これを行うには、person2 つの異なるエイリアスを使用するための 2 つの参照を作成します。family次のように、前の 2 つのステップの結果を表に結合するだけです。

SELECT g.guardianId AS guardianId,
       p1.firstName AS guardianFName, p1.lastName AS guardianLName,
       p2.firstName AS playerFName, p2.lastName AS playerLName
  FROM guardian g
  INNER JOIN person p1
    ON g.personId = p1.personId
  INNER JOIN family f
    ON g.guardianId = f.guardianId
  INNER JOIN player pr
    ON f.playerId = pr.playerId
  INNER JOIN person p2
    ON pr.personId = p2.personId;

への 2 番目の参照に注意してください。personエイリアスはp2です。これにより、テーブルへの 2 番目の参照が与えられ、2 つの参照の異なる行からのデータを結果に含めることができます。

電話番号の取得は、 への簡単な 1 ステップの参加phoneです。

チーム名を取得するには、 にteam_allocation、次に に2 段階で参加する必要がありteamます。から列を返さないだけですteam_allocation

完全なクエリは次のようになります。

SELECT g.guardianId AS guardianId,
       p1.firstName AS guardianFName, p1.lastName AS guardianLName,
       ph.primaryContact AS contact,
       p2.firstName AS playerFName, p2.lastName AS playerLName,
       t.teamName AS teamName
  FROM guardian g
  INNER JOIN person p1
    ON g.personId = p1.personId
  INNER JOIN family f
    ON g.guardianId = f.guardianId
  INNER JOIN player pr
    ON f.playerId = pr.playerId
  INNER JOIN person p2
    ON pr.personId = p2.personId
  INNER JOIN phone ph
    ON g.phoneId = ph.phoneId
  INNER JOIN team_allocation ta
    ON ta.playerId = pr.playerId
  INNER JOIN team t
    ON ta.teamId = t.teamId;

それが役立つことを願っています。

于 2016-06-05T02:22:28.387 に答える