Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL:通过播放器表和子查询创建的高分表进行连接是执行此操作的最佳方式吗?_Sql Server_Join_Sql Server 2014 - Fatal编程技术网

Sql server SQL:通过播放器表和子查询创建的高分表进行连接是执行此操作的最佳方式吗?

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

我有一个问题,我相信(没有完全测试,只有精神状态检查)的工作,但似乎难以置信的过度紧张对我来说。这是三张桌子的连接

一张桌子是带有questID、playerID和score的任务桌子。另一个表是包含玩家所在区域的玩家表。第三张桌子不是真正的桌子;它是一个子查询,生成一个临时结果,由每个区域得分最高的玩家组成

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