Hackerrank THE PADS挑战:MySQL通过但Oracle提交报错求助
Oracle代码在THE PADS挑战中排序不符导致Wrong Answer的原因分析
问题背景
在Hackerrank的THE PADS挑战中,MySQL实现代码可通过所有测试用例,但Oracle版本提交后返回Wrong Answer。对比输出发现,仅统计汇总部分的演员(Actor)和歌手(Singer)顺序与预期不一致,其余内容完全匹配。
代码对比
MySQL 工作代码
SELECT CONCAT(Name, '(', LEFT(Occupation,1), ')') FROM OCCUPATIONS ORDER BY Name asc; SELECT CONCAT('There are a total of ', count(name), ' ', LOWER(occupation),'s.' ) FROM OCCUPATIONS GROUP BY OCCUPATION ORDER BY count(name);
Oracle 存在问题的代码
SELECT Name || '(' || substr(Occupation,1,1) || ')' FROM OCCUPATIONS ORDER BY Name asc; SELECT 'There are a total of ' || count(name) || ' ' || LOWER(occupation) || 's.' FROM OCCUPATIONS GROUP BY OCCUPATION ORDER BY count(name);
核心原因
当多个职业的count(name)值相同时,MySQL和Oracle的默认排序行为存在差异:
- MySQL在执行
GROUP BY并按count(name)排序时,若计数相同,会自动将分组列(occupation)作为次要排序条件,确保相同计数的职业按字母升序排列。 - Oracle仅指定
ORDER BY count(name)时,对于计数相等的分组,排序顺序是不确定的(取决于数据库内部的存储或处理逻辑),不会自动按职业名称排序。
在该挑战的测试用例中,演员和歌手的计数恰好相等,Oracle的不确定排序导致输出顺序不符合题目隐含的“计数相同时按职业名称升序排列”的要求,进而触发Wrong Answer。
修复方案
修改Oracle的汇总查询,在ORDER BY子句中追加occupation作为次要排序条件,明确指定计数相同时的排序规则:
SELECT 'There are a total of ' || count(name) || ' ' || LOWER(occupation) || 's.' FROM OCCUPATIONS GROUP BY OCCUPATION ORDER BY count(name), occupation;
内容的提问来源于stack exchange,提问作者Rin
相关产品推荐
相关产品推荐

