在Select查询中使用TOP和条件



我的查询中有一个表变量,比如说它有StudentId、TotalMarks、Rank,这个表变量中的记录按Rank的顺序存储。

我的存储过程查询使用StudentId作为参数。

现在我想得到排名前3的学生,即排名1、2、3的学生

SELECT TOP 3 [StudentId], [TotalMarks], [Rank]
FROM @TableVariable

现在,除了TOP 3,我还需要获得@StudentId的StudentId、[TotalMarks]、[Rank],它作为参数传递给存储过程。

我可以用下面的查询对上面的查询做一个UNION ALL

SELECT [StudentId], [TotalMarks], [Rank]
FROM @TableVariable
WHERE [StudentId] = @StudentId

我正在检查是否有其他更好的方法可以在没有UNION All的情况下做到这一点。

您可以使用WHERE RANK IN (1,2,3)而不是ORDER BYSELECT TOP 3,如下所示

SELECT [StudentId], [TotalMarks], [Rank]
FROM @TableVariable
WHERE [Rank] IN (1,2,3)
UNION ALL
SELECT [StudentId], [TotalMarks], [Rank]
FROM @TableVariable
WHERE [StudentId] = @StudentId

ROW Number是另一个选项:

这里106是学生ID需要是搜索参数

DECLARE @T TABLE (ID INT, MRK INT,RANK INT)
DECLARE @ID INT=106
INSERT INTO @T VALUES(101,100,1),(102,99,2),(103,98,3),(105,98,5),(106,98,6)
SELECT * FROM (
SELECT *,ROW_NUMBER()OVER(ORDER BY RANK) AS RW
FROM @T) S
WHERE (RW<=3 OR ID=@ID)

如果排名真的是1、2、3(正如你的问题所暗示的那样(,那么你可以使用获得前三名

where rank <= 3 

而不是CCD_ 7。

如果是这种情况,那么只需使用:

select tv.*
from @TableVariable tv
where tv.studentid = @studentid or
rank <= 3
order by tv.rank;

最新更新