2010-10-15 12 views
9

Frage: Ich habe eine Sicht, die ich von einer rekursiven Abfrage ableiten möchte.SQL: Wie erstellt man eine Ansicht aus einer rekursiven Abfrage?

Die Abfrage ist die gleiche Struktur wie dieser hier: http://forums.asp.net/t/1207101.aspx

und stellt eine Baumansicht als eine geordnete Datenmenge.

Wie kann ich eine Ansicht, die dies tut:

;WITH Tree (ID, [NAME], PARENT_ID, Depth, Sort) AS 
(
    SELECT ID, [NAME], PARENT_ID, 0 AS Depth, CONVERT(varchar(255), [Name]) AS Sort FROM Category 
    WHERE PARENT_ID = 0 
    UNION ALL 
    SELECT CT.ID, CT.[NAME], CT.PARENT_ID, Parent.Depth + 1 AS Depth, 
    CONVERT(varchar(255), Parent.Sort + ' | ' + CT.[NAME]) AS Sort 
    FROM Category CT 
    INNER JOIN Tree as Parent ON Parent.ID = CT.PARENT_ID 
) 

-- HERE IS YOUR TREE, Depths gives you the level starting with 0 and Sort is the Name based path 
SELECT ID, [NAME], PARENT_ID, Depth, Sort FROM Tree 
ORDER BY Sort 
+1

Sie könnten eine Inline-Tabellenwertfunktion besser dran zu schaffen, das dies tut. Dann können Sie die übergebene Parent_Id parametrisieren. –

+1

Es ist besser, es in einer Ansicht zu tun, und vielleicht die Haupt-Root-UID als eine Spalte hinzufügen und diese Ansicht von einer gespeicherten Prozedur abfragen. Table Valued Functions wird langsam, wenn Sie viele Daten haben, weil sie temporäre Tabellen im Speicher erstellen, die ausgetauscht werden, wenn der Speicher nicht ausreicht. –

Antwort

14

Es sollte so einfach sein wie:

CREATE VIEW YourViewName 
AS 
    WITH Tree (ID, [NAME], PARENT_ID, Depth, Sort) AS 
    (
     SELECT ID, [NAME], PARENT_ID, 0 AS Depth, CONVERT(varchar(255), [Name]) AS Sort   
     FROM Category 
     WHERE PARENT_ID = 0 
     UNION ALL 
     SELECT CT.ID, CT.[NAME], CT.PARENT_ID, Parent.Depth + 1 AS Depth, 
     CONVERT(varchar(255), Parent.Sort + ' | ' + CT.[NAME]) AS Sort 
     FROM Category CT 
     INNER JOIN Tree as Parent ON Parent.ID = CT.PARENT_ID 
    ) 

    -- HERE IS YOUR TREE, Depths gives you the level starting with 0 and Sort is the Name based path 
    SELECT ID, [NAME], PARENT_ID, Depth, Sort FROM Tree 
GO 
+0

Argh, das Semikolon, sorry, hab es nicht gesehen. PS: Nein, das ist nicht so einfach, nur fast: Du musst die Reihenfolge entfernen oder top 100 Prozent zur select-Anweisung hinzufügen ;-) –

+0

Du willst das ORDER BY entfernen - Es gehört nicht in eine Ansicht, und SQL wird es trotzdem ablehnen –

+0

@Quandary, @Damien: Danke für den Fang auf der 'ORDER BY'. Eine der Gefahren der cut-n-paste-Codierung! :-) Ich werde entsprechend updaten. –

Verwandte Themen