Sma*_*boy 9 sql t-sql sql-server calculated-columns sql-server-2008
我有一个SQL Server 2008 R2数据库.该数据库有两个名为Pictures和PictureUse的表.
图片表包含以下列:
Id (int)
PictureName (nvarchar(max))
CreateDate (datetime )
Run Code Online (Sandbox Code Playgroud)
PictureUse表包含以下列:
Id (int)
Pictureid (int)
CreateDate (datetime )
Run Code Online (Sandbox Code Playgroud)
我需要在Picture表格中创建一个计算列,告诉我这张图片被点击了多少次.有什么帮助吗?
jer*_*enh 23
您可以为此创建用户定义的函数:
CREATE FUNCTION dbo.CountUses(@pictureId INT)
RETURNS INT
AS
BEGIN
RETURN
(SELECT Count(id)
FROM PictureUse
WHERE PictureId = @PictureId)
END
Run Code Online (Sandbox Code Playgroud)
然后可以像这样添加计算列:
ALTER TABLE dbo.Picture
ADD NofUses AS dbo.CountUses(Id)
Run Code Online (Sandbox Code Playgroud)
但是,我宁愿为此做一个观点:
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
Run Code Online (Sandbox Code Playgroud)
计算列只能引用同一表中的其他列.您可以(根据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)
Run Code Online (Sandbox Code Playgroud)
在幕后,SQL Server将有效地创建一个包含此视图结果的表,并且每次插入,更新或删除PictureUse都会自动为您维护此结果表.