2009-06-22 2 views
0

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

Так вот мой pseduo поддельной стол: -

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, так что я могу добавить индекс на ПК, а затем индекс на PostId.

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

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

+0

Как вы можете считать count_big, когда максимальные строки ограничены первичным ключом int? –

+0

Я сделал это, потому что индексированные представления выглядят как COUNT_BIG, когда вы пытаетесь сделать поле COUNT. –

ответ

2

Мысли:

  • Вы не можете использовать COUNT (*) в индексированного представления
  • Вы не можете агрегатные битовые поля

Есть прочие limitations of indexed views

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

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

+0

Ум .. это не сработает :(Как он знает, что такое счет IsHelpfulCount? Это то, что мне нужно определить, в этом представлении :(Может ли это быть подзапросом? –

+0

IsHelpfulCount подразумевает совокупность, нет? вы пробовали его – gbn

+0

С небольшой настройкой, теперь это хорошо. Мне пришлось отбросить поле «Отступы» (я случайно опубликовал это как результат .. это невозможно, когда я делаю скопления: P). Я проверил против быстрого выбора с помощью 2x подзапросы (делать счет), и все это хорошо :) Мне повезло, что я использую 1 и 0 .. так что SUM будет работать :) –