2012-11-21 53 views
8

我有一个SQL Server 2008 R2数据库。这个数据库有两个名为Pictures和PictureUse的表。使用另一个表中的数据创建计算列

图像表有以下栏目:

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

PictureUse表有以下几列:

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

我需要建立在Picture表,告诉我,多少次计算列这张照片已被clicked.any帮助?

回答

21

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

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 
+0

我想你的答案,但它给错误,当我创建'function'和'计算column' – Smartboy

+0

我应该创建一个列第一或函数? – Smartboy

+1

@Smartboy CREATE FUNCTION dbo.CountUses(INT @pictureId)'应该是'CREATE FUNCTION dbo.CountUses(@pictureId INT)'。此外,该函数缺少'BEGIN .. END'和一个'RETURN' –

-2

试试这个

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

计算列可能只引用同一个表中的其他列。您可以(根据jeroenh的answer)使用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都会自动为您维护此结果表格。

+0

+1在读取时,这比UDF好得多,但要注意的是,由于计数行上的锁定,它会对写入进行序列化。 –

0

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

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

这将工作

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 
相关问题