16

我有一个 SQL Server 2008 R2 数据库。该数据库有两个表,分别称为 Pictures 和 PictureUse。

图片表有以下列:

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

PictureUse 表有以下列:

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

我需要在Picture表格中创建一个计算列,告诉我这张图片被点击了多少次。有什么帮助吗?

4

5 回答 5

29

您可以为此创建一个用户定义的函数:

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

然后可以像这样添加计算列:

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

但是,我宁愿对此发表看法:

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 
于 2012-11-21T08:11:05.590 回答
11

计算列只能引用同一个表中的其他列。您可以(根据 jeroenh 的回答)使用 UDF,但该列不会被存储或不可索引,因此每次访问该行时都必须重新计算它。

您可以创建一个包含此信息的索引视图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)

在幕后,SQL Server 将有效地创建一个包含此视图结果的表,并且每次插入、更新或删除PictureUse都会自动为您维护此结果表。

于 2012-11-21T08:13:30.233 回答
0

您不必将计算列添加到表中,因为在更新后,如果原始表数据发生更改,则数据变得不一致,您始终可以使用此 select 语句来获取列数,或将其创建为视图

select p.id,count(*) as count 
from Picture P
join PictureUse  U
on p.id=u.Pictureid 
group by p.id
于 2012-11-21T08:15:55.720 回答
-1

这将起作用

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 
于 2012-11-21T08:26:13.367 回答
-2

试试这个

select count(distict pictureid) from pictureuse 
 inner join picture on picture.id=pictureuse.pictureid
于 2012-11-21T08:12:49.880 回答