16

SQL Server 2008 R2 データベースがあります。このデータベースには、Pictures と PictureUse という 2 つのテーブルがあります。

ピクチャ テーブルには、次の列があります。

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

PictureUse テーブルには次の列があります。

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

Pictureこの画像が何回クリックされたかを示す計算列をテーブルに作成する必要があります。

4

5 に答える 5

29

そのためのユーザー定義関数を作成できます。

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 
于 2012-11-21T08:11:05.590 に答える
11

計算列は、同じテーブル内の他の列のみを参照できます。(jeroenh's 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この結果テーブルが自動的に維持されます。

于 2012-11-21T08:13:30.233 に答える
0

計算列をテーブルに追加する必要はありません。更新後、元のテーブル データが変更された場合、データが不整合になるため、いつでもこの select ステートメントを使用して列数を取得したり、ビューとして作成したりできます。

select p.id,count(*) as count 
from Picture P
join PictureUse  U
on p.id=u.Pictureid 
group by p.id
于 2012-11-21T08:15:55.720 に答える
-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 
于 2012-11-21T08:26:13.367 に答える
-2

これを試して

select count(distict pictureid) from pictureuse 
 inner join picture on picture.id=pictureuse.pictureid
于 2012-11-21T08:12:49.880 に答える