Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.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中循环的最有效方法?_Sql_Sql Server_Tsql - Fatal编程技术网

SQL中循环的最有效方法?

SQL中循环的最有效方法?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有两个SQL Server表: Players ( PlayerID INT, Name VARCHAR(50), Money INT ) Game ( GameID INT, PlayerID INT ) 我需要做一个查询,列出每场比赛中收入最多的球员。最好的方法是什么 我想应该是这样的逻辑: foreach(games) { playersInGame = GetPlayersInGame() return playerWithM

我有两个SQL Server表:

Players (
    PlayerID INT,
    Name VARCHAR(50),
    Money INT
)
Game (
    GameID INT,
    PlayerID INT
)
我需要做一个查询,列出每场比赛中收入最多的球员。最好的方法是什么

我想应该是这样的逻辑:

foreach(games)
{
   playersInGame = GetPlayersInGame()   
   return playerWithMostMoney from playersInGame
}

但是我在TSQL方面做得很差。

使用SQL时,您希望使用
join
groupby
操作来完成在其他语言中使用循环可以完成的工作。与这些语言相比,SQL有很多优势,特别是因为优化器可以从多种实现逻辑的方法中进行选择。例如,SQL引擎可以利用多个处理器,这在过程语言中是很困难的

在您的案例中,逻辑有两部分。第一种方法是将表连接在一起,这将为所有玩家提供一定数量的资金。第二个是找到最好的。为此,我将使用窗口函数
max()
来获取最大金额(我通常会使用
row\u number()
进行此操作,但我认为
max()
更容易解释):

表达式
max(p.money)over(按g.gameid分区)
计算每个游戏的最大金额(基于
partitionby
子句)。最后一个
where
子句是选择钱与最大值匹配的玩家


请注意,如果两个玩家拥有相同的最大值,他们都将被选中
row_number()
是一种选择,它总是只选择一个玩家,即使存在具有相同最大货币价值的重复玩家。

类似于Gordon的答案,但使用
rank

select gameid, playerid, money
from (select g.gameid, p.playerid, p.money,
             rank() over (partition by g.gameid order by p.money desc) rn
      from games g 
      join players p on g.playerid = p.playerid
     ) sq
where rn=1

学习基本的sql,特别是连接,然后只需要一个适当的
order by
子句。您几乎不需要在sql中循环<代码>分组方式聚合和联接通常是正确的方法。要学习基本sql,我听过这本书的好东西,在10分钟内自学sql。顺便说一句,欢迎使用堆栈溢出。要将文本格式化为代码块(语法突出显示),请突出显示文本,然后单击工具栏中的
{}
按钮或
ctl-k
“循环通过”=RBAR。RBAR!=以设定为基础。RBAR坏了,RBAR现在死了。哇,我不知道你能用
超过
max
。我只在
行数
中使用过它。
select gameid, playerid, money
from (select g.gameid, p.playerid, p.money,
             rank() over (partition by g.gameid order by p.money desc) rn
      from games g 
      join players p on g.playerid = p.playerid
     ) sq
where rn=1