2010-04-06 6 views
0

J'ai une table dans SQL qui se lie à elle-même via parentID. Je veux trouver les enfants et leurs enfants et ainsi de suite jusqu'à ce que je trouve tous les objets de l'enfant. J'ai une fonction récursive qui fait cela mais elle semble très inefficace.Méthode plus efficace pour saisir toutes les unités enfants

Existe-t-il un moyen d'obtenir SQL pour trouver tous les objets enfants? Si c'est le cas, comment?

Utilisation de: Microsoft SQL Server Management Studio Express 9.00.2047.00

+0

Ces requêtes sont généralement écrites à la main (ou un concepteur de requêtes) avec 'INNER JOIN' et' LEFT JOIN'. –

+0

Je veux trouver les enfants et leurs enfants et ainsi de suite jusqu'à ce que je trouve tous les objets enfants – Hazior

+2

Pour quelle base de données? S'il vous plaît inclure la version. –

Répondre

2

Consultez la section Sql Server 2005 CTEs.

DECLARE @Table TABLE(
     ID INT, 
     Val VARCHAR(10), 
     ParentID INT 
) 

INSERT INTO @Table SELECT 1, 'A', NULL 
INSERT INTO @Table SELECT 2, 'B', NULL 
INSERT INTO @Table SELECT 3, 'C', 1 
INSERT INTO @Table SELECT 4, 'D', 1 
INSERT INTO @Table SELECT 5, 'E', 4 
INSERT INTO @Table SELECT 5, 'F', 2 

;WITh Parents AS (
    SELECT *, 
      CAST(Val + '/' AS VARCHAR(100))PathVal 
    FROm @Table 
    WHERE ParentID IS NULL 
    UNION ALL 
    SELECT t.*, 
      CAST(p.PathVal + t.Val + '/' AS VARCHAR(100)) 
    FROM @Table t INNER JOIN 
      Parents p ON t.ParentID = p.ID 
) 
SELECT * 
FROM Parents 

En fonction de la profondeur de l'arbre, vous pouvez jeter un oeil à

MAXRECURSION requête indice

+0

Le code gagne. +1 :) –

+0

Merci beaucoup aidé. Je comprends maintenant le langage SQL récursif. – Hazior

0

Vous cherchez CTEs.
Using Common Table Expressions, MSDN.
Vous avez besoin d'au moins SQL Server 2005.

+0

Je veux trouver les enfants et leurs enfants et ainsi de suite jusqu'à ce que je trouve tous les objets enfants – Hazior

+0

Comme andras l'a dit, vous pouvez le faire avec une requête récursive et des CTE. (http://msdn.microsoft.com/en-us/library/ms186243.aspx) – Todd

0

Je suggère quelque chose comme le Nested Set Model.

L'idée est de stocker deux entiers supplémentaires (généralement appelés "gauche" et "droite") pour chaque nœud, calculés selon un système dont vous pouvez lire plus en suivant le lien. Ensuite, les requêtes pour tous les descendants d'un nœud arbitraire deviennent triviales.

Modifier:Here est une description plus détaillée.

+0

Oh, je viens de réaliser que peut-être vous ne pouvez pas changer le schéma de votre table. Si oui, alors cette réponse est inutile. Mais si vous le pouvez, c'est une option intéressante. – Jakob

Questions connexes