2012-11-21 25 views
8

Ho un database SQL Server 2008 R2. Questo database ha due tabelle chiamate Immagini e PictureUse.Crea colonna calcolata utilizzando i dati da un'altra tabella

tavolo Immagine presenta le seguenti colonne:

Id (int) 
PictureName (nvarchar(max)) 
CreateDate (datetime) 

tavolo PictureUse ha le seguenti colonne:

Id (int) 
Pictureid (int) 
CreateDate (datetime) 

Ho bisogno di creare una colonna calcolata nella tabella Picture che mi dice che il numero di volte questa immagine è stata cliccata.un aiuto?

risposta

21

È possibile creare una funzione definita dall'utente per questo:

CREATE FUNCTION dbo.CountUses(@pictureId INT) 
RETURNS INT 
AS 
    BEGIN 
     RETURN 
     (SELECT Count(id) 
     FROM PictureUse 
     WHERE PictureId = @PictureId) 
    END 

La colonna calcolata può essere aggiunto in questo modo:

ALTER TABLE dbo.Picture 
ADD NofUses AS dbo.CountUses(Id) 

Tuttavia, avrei preferito fare una vista per questo:

CREATE VIEW PictureView 
AS 
    SELECT Picture.Id, 
     PictureName, 
     Picture.CreateDate, 
     Count(PictureUse.Id) NofUses 
    FROM Picture 
     JOIN PictureUse 
      ON Picture.Id = PictureUse.PictureId 
    GROUP BY Picture.Id, 
      PictureName, 
      Picture.CreateDate 
+0

ho provato la tua risposta, ma il suo dando errore quando sto creando '' function' e computerizzata column' – Smartboy

+0

Devo creare una colonna prima o una funzione ? – Smartboy

+1

@Smartboy 'CREATE FUNCTION dbo.CountUses (INT @pictureId)' dovrebbe essere 'CREATE FUNCTION dbo.CountUses (@pictureId INT)'. Anche la funzione è mancante 'BEGIN .. END' e un' RETURN' –

-2

provare questo

select count(distict pictureid) from pictureuse 
inner join picture on picture.id=pictureuse.pictureid 
7

Una colonna calcolata può fare riferimento solo ad altre colonne nella stessa tabella. È possibile (come per lo jeroenh answer) utilizzare una UDF, ma la colonna non verrà memorizzata o essere indicizzabile e quindi deve essere ricalcolata ogni volta che si accede alla riga.

Si potrebbe creare un indicizzata vista che contiene queste informazioni (se, come sospetto, è solo il conteggio delle righe da PictureUse):

CREATE VIEW dbo.PictureStats 
WITH SCHEMABINDING 
AS 
    SELECT PictureID,COUNT_BIG(*) as Cnt from dbo.PictureUse 
GO 
CREATE UNIQUE CLUSTERED INDEX IC_PictureStats on dbo.PictureStats (PictureID) 

Dietro le quinte, SQL Server creerà effettivamente un la tabella che contiene i risultati di questa vista e ogni inserimento, aggiornamento o eliminazione su PictureUse manterrà automaticamente questa tabella dei risultati.

+0

+1 questo è molto meglio di un UDF quando si tratta di letture, il grande avvertimento è che serializza le scritture a causa del blocco sulla riga di conteggio. –

0

non è necessario aggiungere la colonna calcolata alla tabella, perché, dopo il suo aggiornamento, se i dati della tabella originale sono stati modificati, i dati diventano incoerenti, è sempre possibile utilizzare questa istruzione select per ottenere il conteggio delle colonne o creare come una visione

select p.id,count(*) as count 
from Picture P 
join PictureUse U 
on p.id=u.Pictureid 
group by p.id 
0

Ciò funzionerà

SELECT P.id 
     ,P.PictureName 
     ,COUNT(P.id) as [Count] 
     FROM Picture P 
     INNER JOIN PictureUse PU 
     ON P.id=PU.Pictureid 
     GROUP BY P.id,P.PictureName