2012-03-14 30 views
6

Ho due tabelle del database, team (ID, NAME, CITY, BOSS, TOTALPLAYER) e Player (ID, NAME, TEAMID, AGE), la relazione tra le due tabelle è uno a molti, una squadra può avere molti giocatori.definire un riferimento colonna calcolata un'altra tabella

Voglio sapere c'è un modo per definire una colonna TOTALPLAYER nella tabella Team come calcolata?

Per esempio, se ci sono 10 giocatori TEAMID è 1, allora la riga in Team tavolo che ID è 1 ha la colonna TOTALPLAYER con un valore di 10. Se posso aggiungere un giocatore, il valore della colonna TOTALPLAYER sale a 11, non ho bisogno di assegnargli un valore esplicito, lascialo generato dal database. Qualcuno sa come realizzarlo?

Thx in anticipo.

BTW, il database è SQL Server 2008 R2

+0

Cosa c'è di sbagliato nel calcolo del valore in una query su richiesta? –

risposta

9

Sì, si può fare questo - hai bisogno di una funzione per contare i giocatori per la squadra, e l'uso che nella colonna calcolata:

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 

e quindi definire la colonna calcolata:

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

Ora, se si seleziona, che la funzione viene chiamata ogni volta, per ogni squadra selezionata. Il valore non è persistente nella tabella Team - è calcolata al volo ogni volta che si seleziona dalla tabella Team.

Poiché il suo valore non è persistente, la domanda è davvero: deve essere una colonna calcolata sul tavolo, o potresti semplicemente usare la funzione memorizzata per calcolare il numero di giocatori, se necessario?

+0

Vuoi dire che la funzione verrà eseguita ogni volta che invierò una squadra? – James

+2

@ HeroIverson3: sì - verrà eseguito su ogni SELECT della tabella che include quella colonna (incluso per ogni 'SELECT * FROM Team') –

+0

C'è un altro modo per realizzarlo? Voglio che la colonna si aggiorni solo quando aggiungo o elimina un giocatore. quando interrogare un team, solo come interrogare altre tabelle, senza eseguire la funzione. Grazie in anticipo! – James

2

Non è necessario memorizzare il totale nella tabella - può essere calcolato quando si esegue una query, qualcosa come:

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

Questo creerà una colonna aggiuntiva "NUM_PLAYERS" nella query , che sarà un conteggio del numero di giocatori di ogni squadra, se ce ne sono.

+2

Fondamentalmente sì, ma questo non si compilerà in SQL Server, perché GROUP BY l'elenco di colonne deve includere tutte le colonne non aggregate a cui si fa riferimento nella clausola SELECT. –

Problemi correlati