【问题标题】:Create Computed Column using data from another table使用另一个表中的数据创建计算列
【发布时间】:2012-11-09 10:36:40
【问题描述】:

我有一个 SQL Server 2008 R2 数据库。该数据库有两个表,分别称为 Pictures 和 PictureUse。

图片表有以下列:

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

PictureUse 表有以下列:

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

我需要在Picture 表中创建一个计算列,它告诉我这张图片被点击了多少次。有什么帮助吗?

【问题讨论】:

    标签: sql sql-server sql-server-2008 tsql calculated-columns


    【解决方案1】:

    您可以为此创建一个用户定义的函数:

    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 
    

    【讨论】:

    • 我试过你的答案,但是当我创建 functionComputed column 时它给出错误
    • 我应该先创建一个列还是一个函数?
    • @Smartboy CREATE FUNCTION dbo.CountUses(INT @pictureId) 应该是 CREATE FUNCTION dbo.CountUses(@pictureId INT)。该功能也缺少BEGIN .. ENDRETURN
    • @MartinSmith 你能修复整个函数它仍然给出错误
    • 检查您的 GROUP BY - 是按 Picture.CreateDate 还是按 PictureUse.CreateDate 分组?
    【解决方案2】:

    试试这个

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

    【讨论】:

      【解决方案3】:

      计算列只能引用同一个表中的其他列。您可以(根据 jeroenh 的 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 的每次插入、更新或删除操作都会自动为您维护此结果表。

      【讨论】:

      • +1 这在读取方面比 UDF 好得多,但需要注意的是,由于计数行上的锁定,它会序列化写入。
      【解决方案4】:

      您不必将计算列添加到表中,因为在更新后,如果原始表数据发生更改,则数据变得不一致,您始终可以使用此 select 语句获取列数,或创建它作为一个视图

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

      【讨论】:

        【解决方案5】:

        这会起作用

        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 
        

        【讨论】:

          猜你喜欢
          • 2023-01-22
          • 1970-01-01
          • 2018-08-13
          • 2018-07-14
          • 1970-01-01
          • 1970-01-01
          • 2013-01-30
          • 1970-01-01
          • 2021-08-21
          相关资源
          最近更新 更多