Pergunta

Ok, estou tentando fazer uma visão indexada contra uma tabela simples que armazena os resultados do que as pessoas pensam ser bom/ruim para uma postagem. Este é o resultado de um polegar para cima / polegar para baixo, votando nos cargos.

Então aqui está minha mesa falsa PSEDUO:-

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

Portanto, um usuário pode ter apenas um voto por post. É 1 (útil) ou 0 (inútil) <- não tenho certeza de uma maneira melhor de lidar com isso, se houver uma maneira melhor.

OK. O que estou tentando fazer é obter uma visão que se parece com o seguinte.

HELWFLEFOSTID INT Identidade (1,1) Não é a chave primária nula,

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

E, finalmente, precisarei torná -lo esquema para adicionar um índice no PK e, em seguida, um índice no postid.

Não tenho idéia do SQL para fazer a vista. Alguma sugestão?

Felicidades :)

Foi útil?

Solução

Pensamentos:

  • Você não pode usar a contagem (*) em uma visão indexada
  • Você não pode agregar campos de bits

Ha outro Limitações de visualizações indexadas

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

Editar: removeu o campo de identidade, que foi adicionado acidentalmente à pergunta/post original.

EDIT 2 (GBN): esqueci que qualquer agregado em uma visão indexada também precisa de um count_big (*). Portanto, basta adicionar um como uma coluna fictícia. Eu testei isso.

Se a definição de visualização usar uma função agregada, a lista de seleção também deverá incluir count_big (*).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top