我有一个SQL Server 2008 R2数据库。该数据库有两个名为Pictures和PictureUse的表。
图片表包含以下列:
Id (int)
PictureName (nvarchar(max))
CreateDate (datetime )
PictureUse表包含以下列:
Id (int)
Pictureid (int)
CreateDate (datetime )
我需要在Picture
表格中创建一个计算列,告诉我这张图片被点击了多少次。有什么帮助?
答案 0 :(得分:23)
您可以为此创建用户定义的函数:
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
答案 1 :(得分:9)
计算列只能引用同一表中的其他列。您可以(根据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
都会自动为您保留此结果表。
答案 2 :(得分:0)
您不必将计算列添加到表中,因为在更新后,如果原始表数据发生更改,则数据变得不一致,您始终可以使用此select语句来获取列数,或者创建它作为观点
select p.id,count(*) as count
from Picture P
join PictureUse U
on p.id=u.Pictureid
group by p.id
答案 3 :(得分:-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
答案 4 :(得分:-2)
试试这个
select count(distict pictureid) from pictureuse
inner join picture on picture.id=pictureuse.pictureid