Create Computed Column using data from another table

后端 未结 5 715
忘掉有多难
忘掉有多难 2020-12-01 16:52

I have a SQL Server 2008 R2 database. This database has two tables called Pictures and PictureUse.

Picture table has the following columns:

Id (int)          


        
相关标签:
5条回答
  • 2020-12-01 17:29

    A computed column may only reference other columns in the same table. You could (as per jeroenh's answer) use a UDF, but the column won't be stored or be indexable and so it has to be recomputed every time the row is accessed.

    You could create an indexed view that contains this information (if, as I suspect, it's just the count of rows from 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)
    

    Behind the scenes, SQL Server will effectively create a table that contains the results of this view, and every insert, update or delete to PictureUse will maintain this results table automatically for you.

    0 讨论(0)
  • 2020-12-01 17:31

    try this

    select count(distict pictureid) from pictureuse 
     inner join picture on picture.id=pictureuse.pictureid
    
    0 讨论(0)
  • 2020-12-01 17:34

    you dont have to add the computed column to your table, because, after its updated,if the original table data got changed, then data become inconsistent , you can always use this select statement to get the column count, or create it as a view

    select p.id,count(*) as count 
    from Picture P
    join PictureUse  U
    on p.id=u.Pictureid 
    group by p.id
    
    0 讨论(0)
  • 2020-12-01 17:42

    You can create a user-defined function for that:

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

    The computed column can then be added like this:

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

    However, I would rather make a view for this:

    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 讨论(0)
  • 2020-12-01 17:55

    This will work

    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 
    
    0 讨论(0)
提交回复
热议问题