Sql server 2008 r2 定义一个计算列引用另一个表

Sql server 2008 r2 定义一个计算列引用另一个表,sql-server-2008-r2,calculated-columns,Sql Server 2008 R2,Calculated Columns,我有两个数据库表,团队ID、姓名、城市、老板、TOTALPLAYER和 球员ID、姓名、团队ID、年龄,两个表之间的关系是一对多,一个团队可以有多个球员 我想知道是否有一种方法可以定义团队表中计算的TOTALPLAYER列 例如,如果有10个玩家的TEAMID为1,那么团队表中ID为1的行的TOTALPLAYER列的值为10。如果我添加一个播放器,TOTALPLAYER列的值将增加到11,我不需要显式地为它赋值,让它由数据库生成。有人知道如何实现它吗 Thx提前 顺便说一句,数据库是SQL Se

我有两个数据库表,团队ID、姓名、城市、老板、TOTALPLAYER和 球员ID、姓名、团队ID、年龄,两个表之间的关系是一对多,一个团队可以有多个球员

我想知道是否有一种方法可以定义团队表中计算的TOTALPLAYER列

例如,如果有10个玩家的TEAMID为1,那么团队表中ID为1的行的TOTALPLAYER列的值为10。如果我添加一个播放器,TOTALPLAYER列的值将增加到11,我不需要显式地为它赋值,让它由数据库生成。有人知道如何实现它吗

Thx提前


顺便说一句,数据库是SQL Server 2008 R2

是的,您可以这样做-您需要一个函数来计算团队中的球员,并在计算列中使用该函数:

CREATE FUNCTION dbo.CountPlayers (@TeamID INT)
RETURNS INT 
AS BEGIN
    DECLARE @PlayerCount INT

    SELECT @PlayerCount = COUNT(*) FROM dbo.Player WHERE TeamID = @TeamID

    RETURN @PlayerCount
END
ALTER TABLE dbo.Team
ADD TotalPlayers AS dbo.CountPlayers(ID) 
然后定义计算列:

CREATE FUNCTION dbo.CountPlayers (@TeamID INT)
RETURNS INT 
AS BEGIN
    DECLARE @PlayerCount INT

    SELECT @PlayerCount = COUNT(*) FROM dbo.Player WHERE TeamID = @TeamID

    RETURN @PlayerCount
END
ALTER TABLE dbo.Team
ADD TotalPlayers AS dbo.CountPlayers(ID) 
现在,如果您选择,则每次都会为所选的每个团队调用该函数。该值不会保留在团队表中-每次从团队表中选择时都会动态计算该值


因为它的值没有持久化,所以问题是:它是否需要是表上的计算列,或者如果需要,您是否可以使用存储函数来计算玩家数量?

您不必将总数存储在表中-它可以在执行查询时计算,例如:

SELECT teams.*, COUNT(players.id) AS num_players
FROM teams LEFT JOIN  players ON teams.id = players.team_id
GROUP BY teams.id;

这将在查询中创建一个额外的num_players列,该列将计算每个团队中的玩家数量,如果有的话。

在按需查询中计算值有什么错?您的意思是每次查询团队时,该函数都会执行吗?@HEROVERSON3:是-它将在包含该列的表的每个SELECT上执行,包括每个SELECT*FROMTeam@HeroIverson3:要仅在某些内容发生更改时实现更新,玩家桌上需要有一个触发器。但这总是有工作不正常的风险——在这种情况下,我可能只会在需要时计算使用该函数或等效子选择的玩家的数量。@HeroVerson3:附议。如果团队中有一个静态可更新的TotalPlayers列,那么为了安全起见,您必须确保该列从未被任何显式更新所触及,只有触发器中的更新,并且为了确保初始值为0,您可能需要指定一个默认约束,并且为了安全起见,在INSERT语句中始终忽略该列。@HeroVerson3:除非它是一个大型数据库,否则我将使用动态计算的值。使用marc_的答案中的函数在表中创建一个静态计算列就可以了,但我只会在表相当小的情况下使用这种方法。否则,我将在查询中计算值。折衷的解决方案可能是根据laser_dude的查询定义一个视图。基本上是的,但这不会在SQL Server中编译,因为GROUP BY column列表必须包含SELECT子句中引用的所有非聚合列。