2008-10-16 5 views
13

Je db table avec relation parent-enfant comme:SQL Query for parent enfant Relation

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 est un nœud racine. Maintenant, je veux écrire une requête SQL qui retournera l'enfant à tous les niveaux d'une catégorie parente.

par exemple. pour nodeId = 1, il doit retourner 3, 4, 5, 6.

J'utilise MS SQL Server 2005

Répondre

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

Je suggère d'ajouter l'indice maximum de récursivité. –

6

Vous devriez regarder dans la Nested Set modèle pour les relations parents-enfants dans un Base de données SQL. C'est beaucoup plus agréable que d'essayer de stocker le parentID des enregistrements dans la table comme ceci, et rend les requêtes comme cela beaucoup plus facile.

4

Et juste pour vous assurer qu'il fonctionne si son parent lui-même (sinon il récursif 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] 
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 
Questions connexes