如何用MSSQL查询Rahul两学期均位列前三的高分科目?
MSSQL解决Term-1和Term-2前三高分共同科目查询问题
问题原因
你写的代码报错是因为MSSQL里INTERSECT这类集合运算的左右子查询不能直接带ORDER BY——ORDER BY默认是用来排序最终输出结果的,不能单独作用于集合运算前的单个查询。但我们又必须先按分数降序排序才能取到真正的前三高分科目,所以得把“排序取TOP 3”的逻辑用子查询或CTE包裹起来,让数据库先执行这部分,再做交集运算。
正确写法1:子查询包裹
SELECT subject FROM ( SELECT TOP 3 subject FROM RESULT WHERE exam = 'Term_1' ORDER BY marks DESC ) AS Term1Top3 INTERSECT SELECT subject FROM ( SELECT TOP 3 subject FROM RESULT WHERE exam = 'Term_2' ORDER BY marks DESC ) AS Term2Top3
正确写法2:CTE(可读性更高)
WITH Term1Top3 AS ( SELECT TOP 3 subject FROM RESULT WHERE exam = 'Term_1' ORDER BY marks DESC ), Term2Top3 AS ( SELECT TOP 3 subject FROM RESULT WHERE exam = 'Term_2' ORDER BY marks DESC ) SELECT subject FROM Term1Top3 INTERSECT SELECT subject FROM Term2Top3
这两种写法都会先分别筛选出Term-1、Term-2按分数降序排列的前三科目,再通过INTERSECT找出同时出现在两个列表里的科目,完全符合需求。
内容的提问来源于stack exchange,提问作者rereer
相关产品推荐
相关产品推荐

