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

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top