2010-10-15 10 views
9

Pytanie: Mam widok, który chcę wyprowadzić z zapytania rekurencyjnego.SQL: Jak utworzyć widok z zapytania rekurencyjnego?

Kwerenda ma taką samą strukturę jak ten tutaj: http://forums.asp.net/t/1207101.aspx

i stanowi katalogów jako uporządkowanego zbioru danych.

Jak mogę utworzyć widok, który wykonuje to:

;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

Możesz być lepiej tworząc inline Tabela Ceniąca funkcja, która to robi. Następnie możesz sparametryzować Parent_Id, które przekazujesz do niego. –

+1

Lepiej zrobić to w widoku, a może dodać główny identyfikator UID jako kolumnę i wysłać zapytanie do tego widoku z procedury składowanej. Table Valued Funkcje będą zwalniać, gdy masz dużo danych, ponieważ tworzą one tymczasowe tabele w pamięci, które zostają zamienione, jeśli pamięć nie jest wystarczająca. –

Odpowiedz

14

powinno być tak proste, jak:

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, średnik, przepraszam, nie widziałem tego. PS: Nie, to nie jest takie proste, tylko prawie: Musisz usunąć zamówienie lub dodać 100% najwyższego poziomu do instrukcji select ;-) –

+0

Będziesz chciał usunąć to ZAMÓWIENIE - Nie należy do widoku, a SQL i tak go odrzuci. –

+0

@Quandary, @Damien: Dzięki za złapanie na "ZAMÓWIENIE PRZEZ". Jedno z zagrożeń związanych z kodowaniem cut-n-paste! :-) Odpowiednio zaktualizuję. –

Powiązane problemy