我有以下表格,团队和游戏。团队表包括团队的两个字母的首字母,其中包括城市和昵称以及团队名称。游戏表包含游戏中团队的团队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
我需要能够回答以下问题:
为印第安纳步行者在主场比赛的球队提供球队名称? (应该返回:波特兰开拓者队,丹佛掘金队,孟菲斯灰熊队等)
提供拥有超过4场主场比赛的球队名称以及他们拥有的主场比赛数量(应该归还印第安纳步行者队,5和孟菲斯队的比赛,4)。
答案 0 :(得分:0)
帮自己一个忙,先修正你的设计。 (或者令人信服地解释为什么你需要这种非规范化形式。)
删除所有Game_<number>
表。然后创建一个表Games
,其中HomeTeam
和GuestTeam
列为任何数据类型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>
表联合起来,并将列表拆分为两列......更复杂,因为它需要。