Создание вычисляемого столбца с использованием данных из другой таблицы

у меня есть база данных SQL Server 2008 R2. Эта база данных имеет две таблицы, называемые Pictures и PictureUse.

таблица имеет следующие столбцы:

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

таблица PictureUse имеет следующие столбцы:

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

мне нужно создать вычисляемый столбец в Picture таблица, которая говорит мне, сколько раз эта картина была нажата.любой помочь ?

5 ответов


вы можете создать пользовательскую функцию для этого:

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 

вычисляемый столбец может ссылаться только на другие столбцы в той же таблице. Вы могли бы (как в 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)

за кулисами SQL Server эффективно создаст таблица, содержащая результаты этого представления и все вставки, обновления или удаления в PictureUse будет поддерживать эту таблицу результатов автоматически для вас.


вам не нужно добавлять вычисляемый столбец в таблицу, потому что после его обновления, если исходные данные таблицы изменились, то данные становятся несогласованными, вы всегда можете использовать этот оператор select, чтобы получить количество столбцов или создать его как представление

select p.id,count(*) as count 
from Picture P
join PictureUse  U
on p.id=u.Pictureid 
group by p.id

Это будет работать

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 

попробуй такое

select count(distict pictureid) from pictureuse 
 inner join picture on picture.id=pictureuse.pictureid