Pregunta

Tengo una tabla db con relación padre-hijo como:

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 es un nodo de nivel raíz. Ahora quiero escribir una consulta SQL que devuelva hijo en todos los niveles de una categoría principal.

por ejemplo para nodeId = 1, debe devolver 3, 4, 5, 6.

Estoy utilizando MS SQL Server 2005

¿Fue útil?

Solución

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]

Otros consejos

Debería considerar el uso del Modelo de Conjunto Anidado para las relaciones padre-hijo dentro de una base de datos SQL. Es mucho mejor que tratar de almacenar el ID de padre de los registros en la tabla de esta manera, y hace que las consultas de este tipo sean mucho más fáciles.

Y solo para asegurarse de que funcione si es un padre de sí mismo (de lo contrario, se recuperará hasta que se rompa):

   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]
 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top