C# 选择顶部和SQL中的选定行

C# 选择顶部和SQL中的选定行,c#,sql,sql-server,C#,Sql,Sql Server,我有一个有3000名参赛者的联盟。我想做的是只选择其中的50个,但如果用户不在前50名中,我还想选择该行并显示其当前位置,下面的查询显示我正在从主内部查询中选择前50名位置,该查询将返回所有玩家及其位置。现在我想显示当前登录的用户及其位置,那么有没有办法通过修改以下内容从子集中选择前50名和用户条目?即,是否可以在一个子集上运行两次选择,如 SELECT TOP 50 AND SELECT TOP 1 (Where condition) FROM ( Subset ) 我的问题 S

我有一个有3000名参赛者的联盟。我想做的是只选择其中的50个,但如果用户不在前50名中,我还想选择该行并显示其当前位置,下面的查询显示我正在从主内部查询中选择前50名位置,该查询将返回所有玩家及其位置。现在我想显示当前登录的用户及其位置,那么有没有办法通过修改以下内容从子集中选择前50名和用户条目?即,是否可以在一个子集上运行两次选择,如

SELECT TOP 50 AND SELECT TOP 1 (Where condition)

FROM 
(
    Subset
)
我的问题

SELECT TOP 50 [LeagueID],
       [EntryID],
       [UserID],
       [TotalPoints],
       [TotalBonusPoints],
       [TotalPointsLastEvnet],
       [TotalBonusPointsLastRaceEvent],
       [Prize],
       [dbo].[GetTotalPool]([LeagueID]) AS [TotalPool],
       DENSE_RANK() OVER( PARTITION BY [LeagueID] ORDER BY [TotalPoints] DESC, [TotalBonusPoints] DESC) AS [Position],
       DENSE_RANK() OVER( PARTITION BY [LeagueID] ORDER BY [TotalPointsLastRace] DESC, [TotalBonusPointsLastRace] DESC) AS [PositionLastRace]
FROM
(
    // inner query here bringing back all entrants

) AS DATA

可以使用union连接两个结果子集:

此外,如果需要从同一suset填充结果,则可以使用公共表表达式:

pseodocode:

with subset(...)

select top 50
union
select top 1

您可以使用CTE而不是子查询,然后选择TOP 50,然后选择TOP 1并合并所有类似的内容

;WITH CTE AS
 (
   // inner query here bringing back all entrants
 )
SELECT TOP 50 * FROM CTE WHERE <Some Codition>
UNION ALL 
SELECT TOP 1  * FROM CTE WHERE <Some other Codition>

请尝试以下操作:

;WITH entrants 
([LeagueID],[EntryID],[UserID],[TotalPoints],[TotalBonusPoints],[TotalPointsLastEvnet],
[TotalBonusPointsLastRaceEvent],[Prize],[TotalPool],[Position],[PositionLastRace])
AS
(
    SELECT [LeagueID],
           [EntryID],
           [UserID],
           [TotalPoints],
           [TotalBonusPoints],
           [TotalPointsLastEvnet],
           [TotalBonusPointsLastRaceEvent],
           [Prize],
           [dbo].[GetTotalPool]([LeagueID]) AS [TotalPool],
           DENSE_RANK() OVER( PARTITION BY [LeagueID] ORDER BY [TotalPoints] DESC, [TotalBonusPoints] DESC) AS [Position],
           DENSE_RANK() OVER( PARTITION BY [LeagueID] ORDER BY [TotalPointsLastRace] DESC, [TotalBonusPointsLastRace] DESC) AS [PositionLastRace]
    FROM
    (
        // inner query here bringing back all entrants

    ) AS DATA
)
SELECT TOP 50 * FROM entrants
UNION
SELECT * FROM entrants WHERE UserID = @current_userid
ORDER BY Position;
你可以不用工会来做这件事。您只需要或:


这将使用行号来执行您希望top执行的操作。我注意到您的问题不包括order by子句,因此我猜您希望按职位排序。

对不起,SQL Server女士,前50名的联合查询加上您想要的可能是最好的方法。
WITH data as (
    // inner query here bringing back all entrants
)
SELECT * -- or whatever columns you really want
FROM (SELECT data.*
             DENSE_RANK() OVER (PARTITION BY [LeagueID]
                                ORDER BY [TotalPoints] DESC, [TotalBonusPoints] DESC
                               ) AS [Position],
             DENSE_RANK() OVER (PARTITION BY [LeagueID]
                                ORDER BY [TotalPointsLastRace] DESC, [TotalBonusPointsLastRace] DESC
                               ) AS [PositionLastRace],
             ROW_NUMBER() OVER (PARTITION BY [LeagueID]
                                ORDER BY [TotalPoints] DESC, [TotalBonusPoints] DESC
                               ) as Position_Rownum
       FROM data
      ) d
WHERE Position_RowNum <= 50 or UserId = @Current_userid