NBA篮球比赛查找

时间:2018-04-29 16:51:20

标签: sql

我有以下表格,团队和游戏。团队表包括团队的两个字母的首字母,其中包括城市和昵称以及团队名称。游戏表包含游戏中团队的团队ID,列出的第一个团队ID是主队。

TeamID    TeamName
DM        Dallas Mavericks              
DN        Denver Nuggets                
DP        Detriot Pistons               
IP        Indiana Pacers                
MG        Memphis Grizzles              
PT        Portland Trailblazers         
Game_1   Game_2   Game_3   Game_4   Game_5
IP, PT   IP, DN   IP, MG   IP, DP   IP, DM    
DM, PT   DM, MG   DM, DP   NULL     NULL
MG, DM   MG, IP   MG, DP   MG, PT    NULL 

我需要能够回答以下问题:

  1. 为印第安纳步行者在主场比赛的球队提供球队名称? (应该返回:波特兰开拓者队,丹佛掘金队,孟菲斯灰熊队等)

  2. 提供拥有超过4场主场比赛的球队名称以及他们拥有的主场比赛数量(应该归还印第安纳步行者队,5和孟菲斯队的比赛,4)。

1 个答案:

答案 0 :(得分:0)

帮自己一个忙,先修正你的设计。 (或者令人信服地解释为什么你需要这种非规范化形式。)

删除所有Game_<number>表。然后创建一个表Games,其中HomeTeamGuestTeam列为任何数据类型Teams.TeamID,列Number应该是某种整数类型。

然后填写Games

+------------+-------------+------------+
| HomeTeamID | GuestTeamID | GameNumber |
+------------+-------------+------------+
| IP         | PT          |          1 |
| DM         | PT          |          1 |
| MG         | DM          |          1 |
| IP         | DN          |          2 |
| DM         | MG          |          2 |
| MG         | IP          |          2 |
                   ...
+------------+-------------+------------|

。然后数据采用“良好”形式,适用于关系处理。

(还可以搜索并阅读有关数据库规范化的更多信息。)

您的第一个查询将类似于

SELECT Teams.TeamName
       FROM Games
            INNER JOIN Teams
                       ON Teams.TeamID = Games.GuestTeamID
       WHERE Games.HomeTeamID = 'IP';

和第二个

SELECT Teams.TeamName,
       count(*) NumberOfGames
       FROM Games
            INNER JOIN Teams
                       ON Teams.TeamID = Games.HomeTeamID
       GROUP BY Teams.HomeTeamID
       HAVING count(*) > 4;

在您当前的非规范化形式中,您必须将所有Game_<number>表联合起来,并将列表拆分为两列......更复杂,因为它需要。