2012-11-21 25 views
8

Mam bazę danych SQL Server 2008 R2. Ta baza danych ma dwie tabele o nazwie Obrazy i PictureUse.Utwórz kolumnę obliczeniową przy użyciu danych z innej tabeli

stół Obraz ma następujące kolumny:

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

PictureUse tabela ma następujące kolumny:

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

muszę utworzyć kolumny obliczane w tabeli Picture który mówi mi, że ile razy to zdjęcie zostało kliknięte.ja pomoc?

Odpowiedz

21

Można utworzyć funkcję zdefiniowaną przez użytkownika za to:

CREATE FUNCTION dbo.CountUses(@pictureId INT) 
RETURNS INT 
AS 
    BEGIN 
     RETURN 
     (SELECT Count(id) 
     FROM PictureUse 
     WHERE PictureId = @PictureId) 
    END 

Kolumna komputerowej można dodać tak:

ALTER TABLE dbo.Picture 
ADD NofUses AS dbo.CountUses(Id) 

Jednak wolałbym zrobić dla tego:

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

próbowałem swoją odpowiedź, ale jej daje błąd, gdy tworzę '' zakresie funkcji i obliczane column' – Smartboy

+0

należy utworzyć pierwszą kolumnę lub funkcję ? – Smartboy

+1

@Smartboy 'CREATE FUNCTION dbo.CountUses (INT @pictureId)' powinno być 'CREATE FUNCTION dbo.CountUses (@pictureId INT)'. Brakuje także funkcji "BEGIN .. END" i "RETURN" –

-2

spróbować

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

Obliczona kolumna może odwoływać się tylko do innych kolumn w tej samej tabeli. Możesz (zgodnie z answer jeroenh) użyć UDF, ale kolumna nie będzie przechowywana lub może być indeksowana i dlatego musi być przeliczone za każdym razem, gdy dostęp do wiersza.

Można utworzyć indeksowany widok zawierającą tę informację (o ile, jak podejrzewam, to tylko liczba wierszy od 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) 

Za kulisami, SQL Server będzie skutecznie stworzyć tabela zawierająca wyniki tego widoku, a każda wstawka, aktualizacja lub usunięcie do PictureUse automatycznie utworzy tę tabelę wyników.

+0

+1 Jest to znacznie lepsze niż UDF, jeśli chodzi o odczyty, dużym zastrzeżeniem jest to, że serializuje zapisy ze względu na blokadę w wierszu liczenia. –

0

Nie musisz dodawać kolumny obliczeniowej do tabeli, ponieważ po jej zaktualizowaniu, jeśli oryginalne dane tabeli zostały zmienione, a następnie dane stają się niespójne, zawsze możesz użyć tej instrukcji select, aby uzyskać liczbę kolumn lub utworzyć to jak myślą

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

to zadziała

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 
Powiązane problemy