Sql server SQL:通过播放器表和子查询创建的高分表进行连接是执行此操作的最佳方式吗?
我有一个问题,我相信(没有完全测试,只有精神状态检查)的工作,但似乎难以置信的过度紧张对我来说。这是三张桌子的连接 一张桌子是带有questID、playerID和score的任务桌子。另一个表是包含玩家所在区域的玩家表。第三张桌子不是真正的桌子;它是一个子查询,生成一个临时结果,由每个区域得分最高的玩家组成Sql server SQL:通过播放器表和子查询创建的高分表进行连接是执行此操作的最佳方式吗?,sql-server,join,sql-server-2014,Sql Server,Join,Sql Server 2014,我有一个问题,我相信(没有完全测试,只有精神状态检查)的工作,但似乎难以置信的过度紧张对我来说。这是三张桌子的连接 一张桌子是带有questID、playerID和score的任务桌子。另一个表是包含玩家所在区域的玩家表。第三张桌子不是真正的桌子;它是一个子查询,生成一个临时结果,由每个区域得分最高的玩家组成 SELECT Q1.QuestID, Q1.PersonID, C1.TerritoryID FROM [dbo].[T_QuestSys_Quest] AS Q1 J
SELECT
Q1.QuestID, Q1.PersonID, C1.TerritoryID
FROM
[dbo].[T_QuestSys_Quest] AS Q1
JOIN
[GZ_GAME].[dbo].[T_Character] AS C1 ON Q1.PersonID = C1.PersonID
JOIN
(SELECT
TerritoryID, MAX(Score) AS HighScore
FROM
[GZ_GAME].[dbo].[T_QuestSys_Quest] AS Q2
JOIN
[GZ_GAME].[dbo].[T_Character] AS C2 ON Q2.PersonID = C2.PersonID
AND Q2.QuestID = @QuestID
GROUP BY
TerritoryID) AS S ON Q1.Score = S.HighScore
AND C1.TerritoryID = S.TerritoryID
AND Q1.QuestID = @QuestID
值得注意的是,子查询不允许我在SELECT
语句中添加额外的术语,从而导致错误:
在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中”)
在我看来,MAX(Score)
足以消除我想要的PersonID
的歧义,但我想不是
无论如何,我的问题是:在优雅/简洁方面有没有更好的方法?在性能方面有没有更好的方法?一种方法使用
行数
窗口功能
;WITH cte
AS (SELECT *,Rwo_number()OVER(partition BY territoryid ORDER BY score DESC) RN
FROM [GZ_GAME].[dbo].[t_questsys_quest] AS Q2
JOIN [GZ_GAME].[dbo].[t_character] AS C2
ON Q2.personid = C2.personid
AND Q2.questid = @QuestID)
SELECT *
FROM cte
WHERE rn = 1
一种方法使用
行数
窗口功能
;WITH cte
AS (SELECT *,Rwo_number()OVER(partition BY territoryid ORDER BY score DESC) RN
FROM [GZ_GAME].[dbo].[t_questsys_quest] AS Q2
JOIN [GZ_GAME].[dbo].[t_character] AS C2
ON Q2.personid = C2.personid
AND Q2.questid = @QuestID)
SELECT *
FROM cte
WHERE rn = 1