J'ai la structure suivante:
[table]
id parent
----------
1 NULL
2 1
3 1
4 2
5 2
6 2
7 3
8 4
Pour chaque id , je veux lister tous ses parents, y compris ses ascendants dans une ligne séparée.
id parent
----------
1 NULL
2 1
3 1
4 1
4 2
5 1
5 2
6 1
6 2
7 1
7 3
8 1
8 2
8 4
J'ai essayé d'utiliser un CTE, mais je n'arrive pas à m'envelopper la tête.
with temp(id,parent) as (
SELECT S.id, S.parent
FROM [table] as S
UNION ALL
SELECT S2.id, S2.parent
FROM [table] as S2
inner join temp on S2.id=temp.parent and temp.id is not null
)
SELECT * FROM temp order by id
J'essaie de parcourir un arbre de hiérarchie et de répertorier tous les nœuds qu'il rencontre sur une ligne distincte pour tous les points de départ de l'arbre. C'est ainsi que les exemples de données m'ont été fournis.
Vous étiez sur la bonne voie et l'aviez presque. Dans la sélection de la deuxième section, la colonne parent doit provenir du cte au lieu de S2 et également dans la deuxième section, la jointure était en arrière (S2.id = p.parent
contre S2.parent = p.id
). Mais c'est tout!
create table [table]
(
id int,
parent int
);
insert into [table] values(1,NULL),
(2,1),
(3,1),
(4,2),
(5,2),
(6,2),
(7,3),
(8,4);
;WITH ctetable(id, parent, depth, path) as
(
SELECT S.id, S.parent, 1 AS depth, convert(varchar(100), S.id) AS path
FROM [table] as S
UNION ALL
SELECT S2.id, p.parent, p.depth + 1 AS depth, convert(varchar(100), (RTRIM(p.path) +'->'+ convert(varchar(100), S2.id)))
FROM ctetable AS p JOIN [table] as S2 on S2.parent = p.id
WHERE p.parent is not null
)
SELECT * FROM ctetable ORDER BY id, parent;