2010-09-14 5 views
0

Nous avons une table où les lignes sont liées de manière récursive à une autre ligne. Je veux extraire des données associées à un parentId donné et à tous ses enfants. Où parentId est l'un de la ligne racine. Je pensais avoir vu ou fait quelque chose comme ça avant, mais je suis incapable de le trouver maintenant. Est-ce que cela peut être fait en SQL ou vaut-il mieux le faire en code?Saisir récursivement toutes les données en fonction d'un ID parent

Je veux la liste pour ressembler à ceci quand je suis fait:

  • Parent
    • enfant
      • Grandchild
+0

Quelle base de données et quelle version utilisez-vous? Toutes les bases de données ne prennent pas en charge les requêtes récursives. –

Répondre

1

Cela peut être fait dans SQL Server 2005 et au-delà en utilisant des expressions de table communes (CTE). Voici un lien de MSDN décrivant les requêtes récursives: Recursive Queries Using Common Table Expressions

Voici un exemple:

Si vous imaginez une ligne hiérarchique de personnes, cette requête vous permettra de voir la ligne complète de toute personne et calculera leur place dans la hiérarchie. Il peut être modifié pour trouver une relation enfant. À la place de l'ID de la personne, vous permutez l'ID de la ligne que vous utilisez comme parent.

--Create table of dummy data 
create table #person (
personID integer IDENTITY(1,1) NOT NULL, 
name  varchar(255) not null, 
dob  date, 
father integer 
); 

INSERT INTO #person(name,dob,father)Values('Pops','1900/1/1',NULL); 
INSERT INTO #person(name,dob,father)Values('Grandma','1903/2/4',null); 
INSERT INTO #person(name,dob,father)Values('Dad','1925/4/2',1); 
INSERT INTO #person(name,dob,father)Values('Uncle Kev','1927/3/3',1); 
INSERT INTO #person(name,dob,father)Values('Cuz Dave','1953/7/8',4); 
INSERT INTO #person(name,dob,father)Values('Billy','1954/8/1',3); 

DECLARE @OldestPerson INT; 
SET @OldestPerson = 1; -- Set this value to the ID of the oldest person in the family 

WITH PersonHierarchy (personID,Name,dob,father, HierarchyLevel) AS 
(
    SELECT 
     personID 
     ,Name 
     ,dob 
     ,father, 
     1 as HierarchyLevel 
    FROM #person 
    WHERE personID = @OldestPerson 

    UNION ALL 

    SELECT 
    e.personID, 
     e.Name, 
     e.dob, 
     e.father, 
     eh.HierarchyLevel + 1 AS HierarchyLevel 
    FROM #person e 
     INNER JOIN PersonHierarchy eh ON 
     e.father = eh.personID 
) 

SELECT * 
FROM PersonHierarchy 
ORDER BY HierarchyLevel, father; 

DROP TABLE #person; 
+0

Hmm ... c'est proche de ce que je pensais. Le seul problème est que je ne vois pas comment intégrer une UL pour indenter les enfants dans la liste. Exemple ajouté ci-dessus. Je peux juste construire ceci dans le code pour que je puisse comprendre comment je pense. –

+0

Si c'est le cas, vous devrez donner plus de détails sur votre environnement de codage. Essayez-vous de le faire sur le serveur ou le client? Utilisez-vous jQuery? Comment transmettez-vous les données au client? –

+0

J'ai décidé de faire une boucle récursive dans le code. Il peut être plus difficile sur la base de données, mais plus facile à coder. Merci pour l'aide en tout cas! –

Questions connexes