2010-01-07 3 views
1

J'ai une table comme indiqué ci-dessous.Requête t-sql récursive

ID ParentID Node Name Node Type 
------------------------------------------------------------------ 
525 524 Root Area Level 1 
526 525 C Area Level 2 
527 525 A Area Level 2 
528 525 D Area Level 2 
671 525 E Area Level 2 
660 527 B Area Level 3 
672 671 F Area Level 3 

Comment puis-je écrire une requête t-sql récursive pour générer une sortie inférieure?

sortie (noeud "Racine" non nécessaire dans la sortie):

Node ID 
----------------------- 
A 527 
A/B 660 
C 526 
D 528 
E 671 
E/F 672 

Merci

+0

Quelle version de sql server? – HLGEM

+0

Et aurez-vous seulement besoin de deux niveaux ou pourrait-il y avoir des données où un se rapporte à b se rapporte à c? – HLGEM

+0

SQL Server 2005. Il pourrait y avoir plus de 2 niveaux – stackoverflowuser

Répondre

9

Jetez un oeil à this page sur l'utilisation des expressions de table commune. Voilà ce que j'utiliserais (en supposant que vous utilisez au moins SQL Server 2005)

Voici un exemple de code utilisant votre cas:

WITH CTE (NodePath, ID) AS (
    SELECT 
     '/' + CAST(NodeName AS NVARCHAR(MAX)) AS NodePath, 
     ID 
    FROM TABLE 
    WHERE NodeName = 'Root' 

    UNION ALL 

    SELECT 
     CTE.NodePath + '/' + CAST(NodeName AS NVARCHAR(MAX)) AS NodePath, 
     TABLE.ID 
    FROM CTE 
    INNER JOIN TABLE ON TABLE.ParentId = CTE.ID 
) 

SELECT 
    NodeName, 
    ID 
FROM CTE 
+0

@Gabriel, +1, je viens d'écrire le même code exemple pour mettre à jour ma réponse précédente =) –

+0

est-il possible que je peux faire quelque chose comme "SELECT NodeName, ID FROM CTE" façon de passer la valeur de niveau à cette –