Consulta SQL para relación padre-hijo
-
03-07-2019 - |
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
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