Создание вычисляемого столбца с использованием данных из другой таблицы
у меня есть база данных 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