определить вычисляемую ссылку на столбец другой таблицы - PullRequest
6 голосов
/ 14 марта 2012

У меня есть две таблицы базы данных, Команда (ID, NAME, CITY, BOSS, TOTALPLAYER) и Игрок (ID, NAME, TEAMID, AGE), отношения между двумя столами один ко многим, в одной команде может быть много игроков.

Я хочу знать, есть ли способ определить столбец TOTALPLAYER в таблице Team как вычисленный?

Например, если у 10 игроков TEAMID равно 1, то строка в таблице Team, в которой ID равно 1, содержит столбец TOTALPLAYER со значением 10. Если я добавлю игрока, значение столбца TOTALPLAYER увеличивается до 11, мне не нужно явно присваивать ему значение, пусть оно генерируется базой данных. Кто-нибудь знает, как это реализовать?

Спасибо заранее.

Кстати, база данных - SQL Server 2008 R2

Ответы [ 2 ]

9 голосов
/ 14 марта 2012

Да, вы можете сделать это - вам нужна функция для подсчета игроков в команде, и используйте ее в вычисляемом столбце:

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) 

Теперь, если вы выберете, эта функция вызывается каждый раз для каждой выбранной команды.Значение не сохраняется в таблице Team - оно рассчитывается на лету каждый раз, когда вы выбираете из таблицы Team .

Поскольку это значение не сохраняется,вопрос на самом деле: должен ли это быть вычисляемый столбец на столе, или вы можете просто использовать хранимую функцию для вычисления количества игроков, если это необходимо?

2 голосов
/ 14 марта 2012

Вам не нужно хранить сумму в таблице - ее можно вычислить при выполнении запроса, например:

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» в запросе, который будет подсчитывать количество игроков в каждой команде, если таковые имеются.

...