2012-03-14 13 views
6

Tengo dos tablas de la base del equipo, (ID, NAME, CITY, BOSS, TOTALPLAYER) y jugador (ID, NAME, TEAMID, AGE), la relación entre las dos tablas es de uno a muchos, un equipo puede tener muchos jugadores.definir una referencia de columna calculada otra mesa

Quiero saber si hay una forma de definir una columna TOTALPLAYER en la tabla Team como se calculó?

Por ejemplo, si hay 10 jugadores TEAMID es 1, entonces la fila de Team mesa que ID es 1 tiene la columna de la TOTALPLAYER con un valor de 10. Si añado un jugador, el valor de la columna de la TOTALPLAYER sube 11, no necesito asignarle valor explícitamente, dejarlo generado por la base de datos. Alguien sabe cómo darse cuenta?

Thx de antemano.

Por cierto, la base de datos es SQL Server 2008 R2

+0

¿Qué hay de malo con el cálculo del valor en una consulta bajo demanda? –

Respuesta

9

Sí, se puede hacer que - se necesita una función para contar los jugadores para el equipo, y el uso que en la columna calculada:

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 

y luego definir su columna calculada:

ALTER TABLE dbo.Team 
ADD TotalPlayers AS dbo.CountPlayers(ID) 

Ahora bien, si se selecciona, la función que se está llamando cada vez, para cada equipo siendo seleccionada. El valor no se conserva en la tabla Equipo - se calcula sobre la marcha cada vez que selecciona de la tabla Equipo.

Dado que su valor no se mantiene, la pregunta realmente es: ¿necesita ser una columna calculada en la tabla, o podría simplemente usar la función almacenada para calcular el número de jugadores, si es necesario?

+0

¿Quiere decir que la función se ejecutará cada vez que consulto a un equipo? – James

+2

@ HeroIverson3: sí - se ejecutará en cada SELECCIÓN de la tabla que incluya esa columna (incluso para cada 'SELECT * FROM Team ') –

+0

¿Hay alguna otra manera de concretarlo? Quiero que la columna solo se actualice cuando agregue o elimine un jugador. cuando consulto un equipo, solo como consultar otras tablas, sin ejecutar la función. ¡Gracias por adelantado! – James

2

Usted no tiene que almacenar el total del cuadro - que puede ser calculada cuando se hace una consulta, algo así como:

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

Esto creará una columna adicional "NUM_PLAYERS" en la consulta , que será un recuento de la cantidad de jugadores en cada equipo, si corresponde.

+2

Básicamente sí, pero esto no se compilaría en SQL Server, porque el GROUP BY la lista de columnas debe incluir todas las columnas no agregadas a las que se hace referencia en la cláusula SELECT. –

Cuestiones relacionadas