Нужна помощь в создании индексированного представления с 2 COUNT_BIG - PullRequest
0 голосов
/ 22 июня 2009

Хорошо, я пытаюсь создать индексированное представление для простой таблицы, в которой хранятся результаты того, что люди считают хорошим / плохим для поста. Это результаты большого пальца вверх / вниз, голосование по сообщениям.

Итак, вот мой псевдо-поддельный стол: -

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

Таким образом, пользователь может иметь только один голос за пост. Это либо 1 (полезно), либо 0 (бесполезно) <- не уверен, что есть лучший способ справиться с этим, если есть лучший способ. </p>

Ok. То, что я пытаюсь сделать, это получить представление, которое выглядит следующим образом.

HelpfulPostId INT IDENTITY (1,1) NOT NULL ПЕРВИЧНЫЙ КЛЮЧ,

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

И, наконец, мне нужно сделать его привязанным к схеме, чтобы я мог добавить индекс на ПК, а затем индекс на PostId.

Понятия не имею о sql, чтобы сделать вид. Есть предложения?

Приветствия:)

1 Ответ

2 голосов
/ 22 июня 2009

Мысль:

  • Вы не можете использовать 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

Edit: Удалено поле Identity, которое было случайно добавлено к исходному вопросу / сообщению.

Редактировать 2 (ГБН): Я забыл, что любой агрегат в индексированном представлении также нуждается в COUNT_BIG (*). Итак, просто добавьте один как фиктивный столбец. Я проверял это.

Если определение вида использует агрегатная функция, список SELECT также должен включать COUNT_BIG (*).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...