我的查询中有一个表变量,比如说它有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 BY
和SELECT 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;