Requête SQL pour relation parent-enfant
-
03-07-2019 - |
Question
J'ai une table db avec une relation parent-enfant sous la forme suivante:
NodeId NodeName ParentId
------------------------------
1 Node1 0
2 Node2 0
3 Node3 1
4 Node4 1
5 Node5 3
6 Node6 5
7 Node7 2
Ici, parentId = 0 signifie qu'il s'agit d'un nœud de niveau racine. Maintenant, je veux écrire une requête SQL qui renverra l'enfant à tous les niveaux d'une catégorie parente.
par exemple. pour nodeId = 1, il devrait renvoyer 3, 4, 5, 6.
J'utilise MS SQL Server 2005
La solution
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]
Autres conseils
Vous devriez envisager d'utiliser le modèle d'ensemble imbriqué pour les relations parent-enfant au sein d'une base de données SQL. C’est bien plus agréable que d’essayer de stocker le parentID des enregistrements dans la table comme ceci, et facilite beaucoup les requêtes de ce type.
Et juste pour vous assurer que cela fonctionne si c'est un parent de lui-même (sinon, il recommencera jusqu'à ce qu'il casse):
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