0

我有下表如下:

League_id     League_name          Team_id     Team_name
257           Copa America         11111       ABC
122           Brazil A             11111       ABC
135           La Liga              987         FC Barca
129           Copa Del Rey         987         *FC Barca Football

*Notice that there each team could play in different leagues

我想对Team_nameColumn 进行健全性检查,并确保Team_name在所有联赛中都是相同的。ieFC Barca Football应该被标记,因为它与FC Barca不同的联赛不同。

进行此检查的最佳方法是什么?

应生成如下错误消息:“Team_Name discrepancy for Team_ID = 987”对于联赛:La Liga (135) 和 Copa Del Rey (129)

谢谢,

4

3 回答 3

4

解决此问题的适当方法是不将 存储team_name在此表中。该team_name列属于team表(我假设team_id是主键)。实际上,league_name也不应该在这个表中——它应该在主键league所在的表中。league_id

所以你真的需要三张桌子

CREATE TABLE league( 
  league_id   NUMBER PRIMARY KEY,
  league_name VARCHAR2(100) NOT NULL
);

CREATE TABLE team(
  team_id   NUMBER PRIMARY KEY,
  team_name VARCHAR2(100) NOT NULL
);

CREATE TABLE team_league(
  team_league_id NUMBER PRIMARY KEY,
  team_id        NUMBER REFERENCES team( team_id ),
  league_id      NUMBER REFERENCES league( league_id ),
  CONSTRAINT uk_team_league UNIQUE( team_id, league_id )
);

然后,您可以创建一个视图来生成您在此处提供的数据

SELECT l.league_id, l.league_name,
       t.team_id,   t.team_name
  FROM league l
       JOIN team_league tl on (l.league_id = tl.league_id)
       JOIN team t on (tl.team_id = t.team_id)
于 2012-11-21T16:10:04.720 回答
0

您可以使用 team_id 和团队名称创建一个单独的表(团队)。对这些设置一个独特的约束。然后把League_id,League_name,Team_id放在League表上。
因此,当您执行查询时,您会从团队表中提取 team_name,从而减少每个 team_id 允许多个团队名称的冗余。

于 2012-11-21T16:14:35.523 回答
0

我建议您规范化您的表格。

换句话说:

创建一个包含id团队名称列的 TEAM 表。创建一个包含id联赛名称列的 LEAGUE 表。

一个联赛可以包含多个球队,一个球队可以包含多个联赛。因此,这应该建模为多对多关系。

即创建一个包含联赛 id球队 id字段的 TEAM_LEAGUE 表

这种建模避免了这个问题,因为现在给定团队有一个唯一的团队名称。

于 2012-11-21T16:15:28.683 回答