使用来自另一个表中的数据创建计算列(Create Computed Column using dat

2019-07-04 00:22发布

我有一个SQL Server 2008 R2数据库。 这个数据库有两个表名为图片和PictureUse。

图像表有以下栏目:

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

PictureUse表有以下几列:

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

我需要在创建一个计算列Picture表,告诉我,多少次这个画面一直clicked.any帮助?

Answer 1:

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

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 


Answer 2:

计算列可以仅参考在同一表中的其它列。 你可以(根据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将保持这种自动表的结果对你。



Answer 3:

你没有计算列添加到您的表,因为,它的更新后,如果原始表中的数据得到了改变,则数据变得不一致,你可以随时使用这个SELECT语句来获取列数,或将其创建为视图

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


Answer 4:

这将工作

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 


Answer 5:

试试这个

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


文章来源: Create Computed Column using data from another table