2012-03-14 6 views
6

は、私は2つのデータベースのテーブル、チームID, NAME, CITY, BOSS, TOTALPLAYER)と プレーヤーID, NAME, TEAMID, AGE)を持っている計算列の参照を定義し、2つのテーブル間の関係は、多くの1つである、1つのチームは多くの選手を持つことができます。は別のテーブル

計算されたTeamテーブルのTOTALPLAYER列を定義する方法はありますか? 10人の選手のTEAMIDは、1であるが存在する場合

たとえば、その後、IDが、私は選手を追加した場合は1が10の値を持つTOTALPLAYER列を持っているTeamテーブルの行は、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:はい - その列を含むテーブルへのすべてのSELECTで実行されます(各SELECT * FROMチームを含む) –

+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

基本的にはyesですが、SQL Serverではコンパイルできません。GROUP BY列リストには、SELECT句で参照されるすべての集約されていない列が含まれている必要があります。 –

関連する問題