使用另一个表中的数据创建计算列
Posted
技术标签:
【中文标题】使用另一个表中的数据创建计算列【英文标题】:Create Computed Column using data from another table 【发布时间】:2012-11-09 10:36:40 【问题描述】:我有一个 SQL Server 2008 R2 数据库。该数据库有两个表,分别称为 Pictures 和 PictureUse。
图片表有以下列:
Id (int)
PictureName (nvarchar(max))
CreateDate (datetime )
PictureUse 表有以下列:
Id (int)
Pictureid (int)
CreateDate (datetime )
我需要在Picture
表中创建一个计算列,它告诉我这张图片被点击了多少次。有什么帮助吗?
【问题讨论】:
【参考方案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
【讨论】:
我试过你的答案,但是当我创建function
和 Computed column
时它给出错误
我应该先创建一个列还是一个函数?
@Smartboy CREATE FUNCTION dbo.CountUses(INT @pictureId)
应该是 CREATE FUNCTION dbo.CountUses(@pictureId INT)
。该功能也缺少BEGIN .. END
和RETURN
@MartinSmith 你能修复整个函数它仍然给出错误
检查您的 GROUP BY - 是按 Picture.CreateDate 还是按 PictureUse.CreateDate 分组?【参考方案2】:
试试这个
select count(distict pictureid) from pictureuse
inner join picture on picture.id=pictureuse.pictureid
【讨论】:
【参考方案3】:计算列只能引用同一个表中的其他列。您可以(根据 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
的每次插入、更新或删除操作都会自动为您维护此结果表。
【讨论】:
+1 这在读取方面比 UDF 好得多,但需要注意的是,由于计数行上的锁定,它会序列化写入。【参考方案4】:您不必将计算列添加到表中,因为在更新后,如果原始表数据发生更改,则数据变得不一致,您始终可以使用此 select 语句获取列数,或创建它作为一个视图
select p.id,count(*) as count
from Picture P
join PictureUse U
on p.id=u.Pictureid
group by p.id
【讨论】:
【参考方案5】:这会起作用
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
【讨论】:
以上是关于使用另一个表中的数据创建计算列的主要内容,如果未能解决你的问题,请参考以下文章