我有一个像Major League Baseball一样的SQL数据库。它有一个美国联盟和国家联盟,其中包含分区,其中包含有赢/输记录并包含球员的球队。
我的联赛表有:| league_name | league_id(主键)|外卡|
如果外卡是外键团队ID,那么该部门中最好的团队并不领导该部门。
当我更新我的Z_TEAMS表(保存赢/输记录)时,这是我更新通配符的触发器:
UPDATE Z_LEAGUES
SET `Z_LEAGUES`.`Wild Card` = (SELECT teamID
FROM Z_TEAMS
WHERE (teamWins/teamLoss) =
(SELECT MAX(teamWins/teamLoss) FROM Z_TEAMS,
Z_DIVISIONS WHERE Z_TEAMS.divID =
Z_DIVISIONS.divID AND Z_DIVISIONS.leagueID =
Z_LEAGUES.leagueID AND Z_TEAMS.teamID != Z_DIVISIONS.divLeader))
通常效果很好,每次更新Z_TEAMS时都会选择正确的团队。但是,如果我尝试更新Z_TEAMS以便2个团队具有相同的记录并且两者都是通配符的候选者,则触发器将返回多行并限制更新。
我的问题是:如何打破这种关系?我愿意在外卡位置展示两支球队,或者随意挑选一支球队,或者按字母顺序挑选。我对SQL很陌生,无法解决这个问题。
答案 0 :(得分:0)
UPDATE Z_LEAGUES
SET `Z_LEAGUES`.`Wild Card` =
(SELECT teamID
FROM Z_TEAMS
WHERE (teamWins/teamLoss) =
(SELECT MAX(teamWins/teamLoss)
FROM Z_TEAMS, Z_DIVISIONS
WHERE Z_TEAMS.divID = Z_DIVISIONS.divID
AND Z_DIVISIONS.leagueID = Z_LEAGUES.leagueID
AND Z_TEAMS.teamID != Z_DIVISIONS.divLeader)
ORDER BY teamID
Limit 1)
在您的基本查询中添加了最后两行。
限制将限制输出行,并且将按顺序排序它们以便选择哪一行的可预先性。
您可以使用order by teamID desc
反向排序。