0

好的,我正在尝试创建一个针对简单表的索引视图,该表存储人们认为帖子的好/坏结果。这是竖起大拇指/大拇指向下,对帖子进行投票的结果。

所以这是我的伪假表:-

HelpfulPostId INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
PostId INT NOT NULL,
IsHelpful BIT NOT NULL,
UserId INT NOT NULL

因此,用户每个帖子只能投一票。它是 1(有帮助)或 0(无用)<- 如果有更好的方法,不确定是否有更好的方法来处理它。

行。我想要做的是获得如下所示的视图。

HelpfulPostId INT IDENTITY(1,1) NOT NULL PRIMARY KEY,

PostId INT NOT NULL,
IsHelpfulCount COUNT_BIG (WHERE IsHelpful = 1)
IsNotHelpfulCount COUNT_BIG (WHERE IsHelpful = 0)

最后,我需要使它成为可绑定的,这样我就可以在 PK 上添加一个索引,然后在 PostId 上添加一个索引。

我不知道制作视图的sql。有什么建议么?

干杯:)

4

1 回答 1

2

想法:

  • 您不能在索引视图中使用 COUNT(*)
  • 你不能聚合位域

索引视图还有其他限制

CREATE VIEW dbo.Example
WITH SCHEMABINDING
AS
SELECT
    PostId,
    SUM(CAST(IsHelpful AS bigint)) AS IsHelpfulCount,
    SUM(CAST(1-IsHelpful AS bigint)) AS IsNotHelpfulCount,
    COUNT_BIG(*) AS Dummy   --Used to satisfy requirement
FROM
    dbo.bob
GROUP BY
    PostId
GO
CREATE UNIQUE CLUSTERED INDEX IXC_Test ON dbo.Example (PostId)
GO

编辑:删除了身份字段,该字段被意外添加到原始问题/帖子中。

编辑 2 (gbn):我忘记了索引视图中的任何聚合需要 COUNT_BIG(*)。因此,只需添加一个作为虚拟列。我已经测试过了。

如果视图定义使用聚合函数,则 SELECT 列表还必须包含 COUNT_BIG (*)。

于 2009-06-22T05:10:31.293 回答