2012-03-14 1 views
6

을 정의, 두 테이블 사이의 관계는 많은 사람들에게, 한 팀은 많은 선수를 가질 수입니다.나는 두 개의 데이터베이스 테이블, <strong>팀</strong> (<code>ID, NAME, CITY, BOSS, TOTALPLAYER</code>)와 <strong>플레이어</strong> (<code>ID, NAME, TEAMID, AGE</code>)가 계산 된 열 참조를 다른 테이블

알고 싶습니다. 계산 된대로 Team 테이블에 TOTALPLAYER 열을 정의하는 방법이 있습니까? (10 명) 선수의 TEAMID가 1 인이있는 경우

예를 들어, 다음 ID 내가 선수를 추가하면 1 (10)의 값으로 TOTALPLAYER 열이 있습니다 Team 테이블의 행은 TOTALPLAYER 열의 값까지 간다 11, 명시 적으로 값을 할당 할 필요가 없으며 데이터베이스에서 생성됩니다. 누구나 그것을 깨닫는 법을 아십니까?

Thx.

BTW, 데이터베이스는 SQL 서버 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

기본적으로 네,하지만 SQL Server에서는 컴파일되지 않습니다. 왜냐하면 GROUP BY 열 목록에는 SELECT 절에서 참조 된 모든 집계되지 않은 열이 포함되어야합니다. –