2012-11-21 55 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 
相關問題