2009-06-22 6 views
0

Ok, ich versuche eine indizierte Ansicht zu erstellen, die gegen eine einfache Tabelle ist, die die Ergebnisse dessen speichert, was für einen Post gut/schlecht ist. Dies ist das Ergebnis eines Daumen hoch/Daumen nach unten, Abstimmung über Beiträge.Benötigen Sie Hilfe bei der Erstellung einer indizierten Sicht mit 2 COUNT_BIGs

Also hier meine pseduo gefälschte Tabelle: -

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

So ein Benutzer nur eine Stimme per Post haben. Es ist entweder eine 1 (hilfreich) oder 0 (nicht hilfreich) < - nicht sicher von einem besseren Weg, damit umzugehen, wenn es einen besseren Weg gibt.

Ok. Was ich versuche, ist eine Ansicht, die wie folgt aussieht.

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) 

Und schließlich werde ich es so machen müssen schemabindable i einen Index für die PK hinzufügen und dann ein Index auf der Post-ID.

Ich habe keine Ahnung von der Sql, um die Aussicht zu machen. Irgendwelche Vorschläge?

Prost :)

+0

Wie können Sie möglicherweise count_big, wenn die maximale Zeilen durch einen int-Primärschlüssel begrenzt ist? –

+0

Ich habe das getan, weil indexierte Ansichten nur wie COUNT_BIG aussehen, wenn Sie versuchen, ein COUNT-Feld zu erstellen. –

Antwort

2

Gedanken:

  • Sie können nicht COUNT (*) in einer indizierten Sicht
  • verwenden Sie können nicht Aggregat Bitfelder

Es gibt andere 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: Das Identity-Feld entfernt, das versehentlich der ursprünglichen Frage/Post hinzugefügt wurde.

Edit 2 (GBN): habe ich vergessen, dass jedes Aggregat in einer indizierten Sicht auch benötigt ein COUNT_BIG (*). Fügen Sie einfach eine als Dummy-Spalte hinzu. Ich habe das getestet.

Wenn die View-Definition verwendet eine Aggregatfunktion, die SELECT-Liste muss auch COUNT_BIG (*).

+0

Um .. das wird nicht funktionieren :(Wie weiß es, was die Zahl von IsHelpfulCount ist? Das ist, was ich definieren muss, in dieser Ansicht :(Kann das eine Unterabfrage sein? –

+0

IsHelpfulCount bedeutet Aggregat, nein? Und haben Sie haben es versucht – gbn

+0

Mit ein wenig Feinabstimmung, es ist jetzt gut. Ich musste das Indentity-Feld fallen lassen (ich versehentlich gepostet als Ergebnis .. was unmöglich ist, wenn ich Aggregationen mache: P). Ich checkte gegen eine schnelle Auswahl mit 2x Unterabfragen (eine Zählung machen) und es ist alles gut :) Ich bin glücklich, ich benutze 1 & 0 .. so würde die SUM arbeiten :) –

Verwandte Themen