Нужна помощь в создании индексированного представления с 2 COUNT_BIG
-
06-07-2019 - |
Вопрос
Хорошо, я пытаюсь создать индексированное представление, соответствующее простой таблице, в которой хранятся результаты того, что люди считают хорошим/плохим для сообщения.Это результаты лайков вверх/палец вниз, голосования по постам.
Итак, вот моя псевдофальшивая таблица: -
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) НЕ НУЛЕВОЙ ПЕРВИЧНЫЙ КЛЮЧ,
PostId INT NOT NULL,
IsHelpfulCount COUNT_BIG (WHERE IsHelpful = 1)
IsNotHelpfulCount COUNT_BIG (WHERE IsHelpful = 0)
И, наконец, мне нужно сделать его привязываемым к схеме, чтобы я мог добавить индекс для PK, а затем индекс для PostId.
Я понятия не имею о SQL для создания представления.Какие-либо предложения?
Ваше здоровье :)
Решение
Мысли:
- Вы не можете использовать 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(*).Итак, просто добавьте его в качестве фиктивного столбца.Я проверил это.
Если в определении представления используется функция агрегации, список выбора также должен включать в себя count_big (*).