Нуждаете се от помощ за създаване на индексиран изглед с 2 COUNT_BIG

Добре, опитвам се да направя индексиран изглед, който е срещу проста таблица, която съхранява резултатите от това, което хората смятат за добро/лошо за публикация. Това са резултатите от палец нагоре / палец надолу, гласуване на публикации.

И така, ето моята псевдо фалшива таблица: -

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)

И накрая, ще трябва да го направя schemabindable, за да мога да добавя индекс на PK и след това индекс на PostId.

Нямам представа за sql, за да направя изгледа. Някакви предположения?

Наздраве :)


person Pure.Krome    schedule 22.06.2009    source източник
comment
как е възможно да count_big, когато максималните редове са ограничени от int първичен ключ?   -  person Mitch Wheat    schedule 22.06.2009
comment
Направих това, защото индексираните изгледи само като COUNT_BIG, когато се опитате да направите COUNT поле.   -  person Pure.Krome    schedule 22.06.2009


Отговори (1)


мисли:

  • Не можете да използвате 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 (*).

person gbn    schedule 22.06.2009
comment
Хм .. това няма да проработи :( Откъде знае какъв е броят на IsHelpfulCount?? Това е, което трябва да дефинирам в този изглед :( Може ли това да е подзаявка? - person Pure.Krome; 22.06.2009
comment
С малко корекции вече е добре. Трябваше да премахна полето Идентификация (случайно публикувах това като резултат .. което е невъзможно, когато правя агрегации :P). Проверих срещу бърз избор с 2x подзаявки (правя преброяване) и всичко е наред :) Късметлия съм, че използвам 1&0.. така че SUM ще работи :) - person Pure.Krome; 22.06.2009
comment
:( когато се опитам да индексирам този изглед, не работи. Казвам, че имам нужда от COUNT_BIG(*) ??? - person Pure.Krome; 22.06.2009
comment
.. но сега работи (мога да добавя уникален клъстерен индекс), когато добавя следното към израза select.. =› COUNT_BIG(*) AS TotalCount - person Pure.Krome; 22.06.2009
comment
наздраве. Потвърдено също. Работи страхотно :) поздравления, колега, че продължи с това. - person Pure.Krome; 22.06.2009