2010-10-15 20 views
9

Domanda: Ho una vista che voglio derivare da una query ricorsiva.SQL: come creare una vista da una query ricorsiva?

La query è della stessa struttura come questa qui: http://forums.asp.net/t/1207101.aspx

E rappresenta una vista ad albero come un set di dati ordinata.

Come si crea una vista che fa questo:

;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

Si potrebbe essere meglio la creazione di una funzione valutata in linea tabella che fa questo. Quindi puoi parametrizzare l'id padre che gli passi. –

+1

È meglio farlo in una vista, e magari aggiungere l'uid della root principale come una colonna, e interrogare quella vista da una stored procedure. Le funzioni con valori di tabella diventeranno lenti quando si hanno molti dati, perché creano delle tabelle temporanee in memoria, che vengono scambiate se la memoria non è sufficiente. –

risposta

14

Dovrebbe essere semplice come:

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, il punto e virgola, scusa, non l'ho visto. PS: No, non è così semplice, solo quasi: devi rimuovere l'ordine o aggiungere il 100% più importante alla dichiarazione prescelta ;-) –

+0

Dovrai rimuovere ORDINA PER - Non appartiene a una vista, e SQL lo rifiuterà comunque –

+0

@Quandary, @Damien: Grazie per la presa sul 'ORDER BY'. Uno dei rischi della codifica cut-n-paste! :-) aggiornerò in modo appropriato. –

Problemi correlati