我想知道如何在我的数据库中检索获奖女性。 获胜的男女比赛是:
埃德雷诺兹男子41分钟Erna Obrien女43分钟
可以使用
检索获胜的男人MIN(performance_in_minutes)因为那样我将获得总冠军,这恰好是男人
但我如何找回获奖女性?我尝试了以下查询,但这不会起作用......
SELECT A.Fname, A.Sex, PI.Performance_in_minutes
from athlete as A LEFT OUTER JOIN participation_ind as PI on A.athleteID = PI.athleteID
WHERE eventID = 35
AND PI.Performance_in_minutes =
(SELECT MIN(PI.performance_in_minutes) FROM participation_ind PI WHERE PI.eventID = 35 AND A.Sex = 'F')
答案 0 :(得分:0)
您的查询有两个问题。
您的子查询 尝试 ,以获得女性事件35的最短时间。不幸的是,如果您拥有A.sex = 'f'
,则您的内部查询在任何位置都没有A
表。 (您还需要在子查询中的JOIN
表中包含athlete
。)
AND PI.Performance_in_minutes = (
SELECT MIN(PI.performance_in_minutes)
FROM participation_ind PI
INNER JOIN athlete A ON A.athleteID = PI.athleteID
WHERE PI.eventID = 35
AND A.Sex = 'F'
)
如果不这样做,您的子查询的WHERE
子句将引用外部查询的A
表。哪个没有完成任何事情。
然后,你还需要将外部查询过滤到女性...... (如果你没有和男性运动员碰巧与获胜的女运动员同时完成,那么男运动员也将被退回。)
SELECT
A.Fname, A.Sex, PI.Performance_in_minutes
FROM
athlete A
INNER JOIN
participation_ind PI
ON A.athleteID = PI.athleteID
WHERE
PI.eventID = 35
AND A.Sex = 'F'
AND PI.Performance_in_minutes = (
SELECT
MIN(PI.performance_in_minutes)
FROM
athlete A
INNER JOIN
participation_ind PI
ON A.athleteID = PI.athleteID
WHERE
PI.eventID = 35
AND A.Sex = 'F'
)
如果您知道只有 一个 获胜者,这可以简化很多。但是子查询版本更好,因为它解释了两个或更多运动员并列第一名的罕见情况。
您还可以通过加入子查询来减少代码中的一些重复,而不是在WHERE
子句中使用它。
SELECT
A.Fname, A.Sex, PI.Performance_in_minutes
FROM
(
SELECT
PI.eventID,
A.Sex,
MIN(PI.performance_in_minutes) AS performance_in_minutes
FROM
participation_ind PI
INNER JOIN
athlete A
ON A.athleteID = PI.athleteID
GROUP BY
PI.eventID,
A.Sex
)
winning_times
INNER JOIN
participation_ind PI
ON PI.eventID = winning_times.eventID
AND PI.performance_in_minutes = winning_times.performance_in_minutes
INNER JOIN
athlete A
ON A.athleteID = PI.athleteID
AND A.Sex = winning_times.Sex
WHERE
winning_times.eventID = 35
AND winning_times.Sex = 'F'
现在,您只需更改一个WHERE
子句,而不是两个,就可以更改要分析的事件或性别。