2012-03-14 2 views
6

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

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

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

Thx заранее.

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

+0

Что не так при вычислении значения в запросе по запросу? –

ответ

9

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

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) 

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

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

+0

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

+2

@ HeroIverson3: yes - он будет выполняться на каждом SELECT в таблице, которая включает этот столбец (в том числе для каждого SELECT * FROM Team) –

+0

Есть ли другой способ его реализовать? Я хочу, чтобы столбец обновлялся только при добавлении или удалении игрока. когда я запрашиваю команду, только как запросы других таблиц, без выполнения функции. Заранее спасибо! – James

2

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

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

+2

В принципе да, но это не будет компилироваться в SQL Server, потому что GROUP BY список столбцов должен включать все неагрегированные столбцы, на которые ссылается предложение SELECT. –