跨表查询赛事中最年轻澳大利亚运动员SQL返回空行求助
问题排查与正确实现方案
原问题场景
需要查询赛事中最年轻的澳大利亚运动员,但编写的SQL执行后返回空行,原代码如下:
SELECT AthleteName, Age FROM Athletes JOIN Countries ON Countries.CountryID = Athletes.CountryID WHERE CountryName = 'Australia' AND Age = (SELECT MIN(Age) FROM Athletes)
问题排查
原SQL的核心错误在于子查询SELECT MIN(Age) FROM Athletes计算的是所有运动员的全局最小年龄,但这个年龄对应的运动员大概率不是澳大利亚籍的。当澳大利亚没有运动员达到这个全局最小年龄时,自然返回空结果。
正确实现方案
方案1:先计算澳大利亚运动员的最小年龄再匹配
SELECT AthleteName, Age FROM Athletes JOIN Countries ON Countries.CountryID = Athletes.CountryID WHERE CountryName = 'Australia' AND Age = ( -- 仅计算澳大利亚运动员的最小年龄 SELECT MIN(Age) FROM Athletes JOIN Countries ON Countries.CountryID = Athletes.CountryID WHERE CountryName = 'Australia' )
方案2:使用窗口函数(支持MySQL 8+、PostgreSQL等)
如果存在多名同年龄的最年轻澳大利亚运动员,该方案可以一次性返回所有符合条件的记录:
SELECT AthleteName, Age FROM ( SELECT AthleteName, Age, -- 给澳大利亚运动员按年龄升序排名 RANK() OVER(PARTITION BY Countries.CountryID ORDER BY Age ASC) AS age_rank FROM Athletes JOIN Countries ON Countries.CountryID = Athletes.CountryID WHERE CountryName = 'Australia' ) AS ranked_athletes WHERE age_rank = 1
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

