Oracle:如何比较sql developer中的多行并确保它们是一样的?

时间:2012-11-21 16:05:34

标签: sql oracle plsql

我的下表如下:

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_name列进行健全检查,并确保Team_name在所有联赛中都是相同的。即FC Barca Football应标记,因为它与其他联盟中的FC Barca不同。

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

以下错误信息应该产生:  联盟的“Team_Name差异为Team_ID = 987”:西甲(135)和Copa Del Rey(129)

谢谢,

3 个答案:

答案 0 :(得分:4)

解决此问题的适当方法是不在此表中存储team_nameteam_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)

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我建议你规范你的桌子。

换句话说:

使用 id 团队名称列创建TEAM表。 使用 id 联盟名称列创建LEAGUE表。

联盟可以包含许多团队,团队可以包含许多联盟。 因此,应将其建模为多对多关系。

即。 创建一个TEAM_LEAGUE表,其中包含联盟ID 团队ID 字段

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