2010-10-15 12 views
9

Pregunta: Tengo una vista que quiero derivar de una consulta recursiva.SQL: ¿Cómo crear una vista desde una consulta recursiva?

la consulta es de la misma estructura como esta aquí: http://forums.asp.net/t/1207101.aspx

y representa una vista de árbol como un conjunto de datos ordenados.

¿Cómo puedo crear una vista que hace esto:

;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

Usted puede ser mejor crear una función de valor en línea de la tabla que hace esto. Luego puede parametrizar el Parent_Id que le pasa. –

+1

Es mejor hacerlo en una vista, y tal vez agregar el uid raíz principal como una columna, y consultar esa vista desde un procedimiento almacenado. Las funciones con valores de tabla disminuirán cuando tenga muchos datos, ya que crean tablas temporales en la memoria, que se intercambian si la memoria no es suficiente. –

Respuesta

14

Debe ser tan simple como:

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, el punto y coma, lo siento, no lo vi. PD: No, no es así de simple, solo casi: debe eliminar el orden o agregar el 100 por ciento superior a la declaración seleccionada ;-) –

+0

Te conviene eliminar esa ORDEN POR - No pertenece a una vista, y SQL lo rechazará de todos modos –

+0

@Quandary, @Damien: Gracias por la captura de 'ORDER BY'. ¡Uno de los peligros de la codificación de cortar y pegar! :-) Actualizaré apropiadamente. –

Cuestiones relacionadas