2010-10-26 39 views
0

J'ai une table relationnelle (id, parentId, nom)Transformer une table de parent/enfant à une colonne fixe dimentionnelle

que je voudrais convertir à une table dimentionnelle aplaties

(id , Niveau1, Niveau2, Niveau3, Niveau4)

Je vais bien fixer la profondeur à 4 profondeur.

J'ai fait des progrès avec un CTE récursive et pivot, mais le jeu de résultats n'est pas droit

Je reçois

Id Name Level1 Level2 
0 Root NULL NULL 
1 NULL L1  NULL 

mais je dois

Id Name Level1 Level2 
0 Root NULL NULL 
1 Root L1  NULL 

ce qui est ici, je avoir à ce jour

with rcte as 
(
     select h.id 
     ,h.parent_id 
     ,h.name 
     ,1 as HierarchyLevel 
    FROM RelTable h 
    where id = 1 
    union all 
    select h2.id 
     , h2.parent_id 
     , h2.name 
     , r.HierarchyLevel + 1 AS HierarchyLevel 
    FROM RelTable h2 
    inner join rcte r on h2.parent_id = r.id 
) 
select id, parent_id, [1] as L1,[2] as L2,[3] as L3, [4] as L4 
from (
select id,parent_id,name,HierarchyLevel from rcte 
) as src 
pivot (max(name) for HierarchyLevel in ([1],[2],[3],[4])) as pvt 

qu'est-ce que je fais mal?

+0

peut vous aider si vous nous avez montré les données que vous avez commencées. – DForck42

Répondre

2

Sur-compliquer la solution? Si elle est fixée à quatre de profondeur, alors il peut être fait avec quelques simples ... rejoint

SELECT 
    L1.id as ID 
    L1.Name as Level1 
    L2.Name as Level2 
    L3.Name as Level3 
    L4.Name as Level4 
FROM 
    RelTable as L1 

     INNER JOIN 
    RelTable as L2 
     ON L1.id = L2.ParentID 

     INNER JOIN 
    RelTable as L3 
     ON L2.id = L3.ParentID 

     INNER JOIN 
    RelTable as L4 
     ON L3.id = L4.ParentID 

En guise d'exercice à l'utilisation de son inutile CTEs, mais il fait ce que vous avez besoin.

+0

oui, parfois on dépasse les choses ... –