Créer une colonne calculée en utilisant datatables d'une autre table

J'ai une database SQL Server 2008 R2. Cette database possède deux tables appelées Pictures et PictureUse.

La table d'image comporte les colonnes suivantes:

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

La table PictureUse comporte les colonnes suivantes:

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

J'ai besoin de créer une colonne calculée dans le tableau Picture qui me dit combien de fois cette image a été cliquée. Quelle aide?

    Vous pouvez créer une fonction définie par l'user pour cela:

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

    La colonne calculée peut alors être ajoutée comme ceci:

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

    Cependant, je préférerais faire une opinion à ce sujet:

     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 

    Une colonne calculée peut uniquement referencer d'autres colonnes dans la même table. Vous pourriez (selon la réponse de jeroenh) utiliser un UDF, mais la colonne ne sera pas stockée ou être indexable et doit donc être recalculée chaque fois que la ligne est accédée.

    Vous pouvez créer une vue indexée qui contient cette information (si, comme je le soupçonne, c'est juste le nombre de lignes de 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) 

    Dans les coulisses, SQL Server va effectivement créer une table qui contient les résultats de cette vue, et chaque insertion, mise à jour ou suppression de PictureUse maintiendra automatiquement cette table de résultats pour vous.

    vous n'avez pas besoin d'append la colonne calculée à votre table car, après sa mise à jour, si datatables de la table d'origine ont été modifiées, datatables deviennent incohérentes, vous pouvez toujours utiliser cette instruction select pour get le nombre de colonnes ou la créer en vue

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

    Cela fonctionnera

     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 

    essaye ça

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