2008-10-16 18 views
13

tengo db mesa con relación padre-hijo como:de consultas SQL para Padres de Niños Relación

NodeId NodeName ParentId 
------------------------------ 
1   Node1  0 
2   Node2  0 
3   Node3  1 
4   Node4  1 
5   Node5  3 
6   Node6  5 
7   Node7  2 

Aquí parentId = 0 significa que se trata de un nodo de nivel raíz. Ahora quiero escribir una consulta SQL que devolverá el elemento secundario en todos los niveles de una categoría principal.

p. Ej. para NODEID = 1, debe devolver 3, 4, 5, 6.

estoy usando MS SQL Server 2005

Respuesta

10
with [CTE] as (
    select * from [TheTable] c where c.[ParentId] = 1 
    union all 
    select * from [CTE] p, [TheTable] c where c.[ParentId] = p.[NodeId] 
) 
select * from [CTE] 
+1

Sugiero añadir el máximo pista recursividad. –

6

Usted debe mirar en usar el modelo de conjuntos anidados para las relaciones entre padres e hijos dentro de una Base de datos SQL Es mucho mejor que tratar de almacenar el parentID de los registros en la tabla de esta manera, y hace las consultas de este tipo mucho más fáciles.

4

Y sólo para asegurarse de que funciona si es un padre de sí mismo (de lo contrario será recursiva hasta que se rompe):

with [CTE] as (
     select * from [TheTable] c where c.[ParentId] = 1 
     union all 
     select * from [CTE] p, [TheTable] c where c.[ParentId] = p.[NodeId] 
     and c.[ParentId] <> c.[NodeId] 
    ) 
    select * from [CTE] 
1
WITH Temp_Menu AS 
( 
    SELECT AM.* from FCB_AccessMenu AM where AM.[ParentId] = 6 

      UNION ALL  

     SELECT AM.* FROM FCB_AccessMenu AM ,Temp_Menu TM WHERE AM.[ParentID]=TM.[MenuID]   

) 

    SELECT * FROM Temp_Menu ORDER BY ParentID 
Cuestiones relacionadas