SQL Server – Récupère les valeurs parentes de l'enfant de manière récursive

Donc, je me suis battu avec cela pour la dernière heure ou deux maintenant

J'écris un script pour extraire des données dans un bon format pour que je puisse les utiliser dans un autre process mais je n'arrive pas à comprendre ce bit particulier (je n'utilise pas beaucoup SQL Server)

J'ai plusieurs tables qui sont toutes impliquées dans ce script qui se lient set pour get toutes les informations. Toutes ces tables n'utilisent que de fausses données et noms mais elles montrent la structure

tblCatégories

cat_id cat_name 1 Trousers 2 Tracksuits 3 Woolen 

tblCategoryHierarchy

 ch_parentid ch_childid 0 1 1 2 2 3 

J'ai aussi ma table de produit qui contient le cat_id

tblProduit

 p_id p_name p_cat_id 1 Red Trouser 3 

Donc, à partir de cela, je veux afficher l'identifiant du produit, le nom et la hiérarchie de toutes les catégories liées à celui dans le tblProduct.

Donc, pour cet exemple, il afficherait:

 id name cats 1 Red Trouser Trousers > Tracksuits > Woolen 

J'espère que quelqu'un peut me donner un coup de main ici! Merci

Essaye ça:

 ;WITH CTE AS ( SELECT p.p_id AS id, p.p_cat_id, 1 AS level, p.p_name, CAST(c.cat_name AS VARCHAR(200)) AS cat FROM tblProduct AS p JOIN tblCategories AS c ON p.p_cat_id = c.cat_id UNION ALL SELECT c.id, ch.ch_parentid AS cat_id, level = c.level + 1, c.p_name, CAST(c2.cat_name AS VARCHAR(200)) AS cat FROM tblCategoryHierarchy AS ch JOIN CTE AS c ON ch.ch_childid = c.p_cat_id JOIN tblCategories AS c2 ON ch.ch_parentid = c2.cat_id ) SELECT id, p_name, STUFF(REPLACE((SELECT CONCAT('>', cat) FROM CTE ORDER BY level DESC FOR XML PATH('')), '>', '>'), 1, 1, '') AS cat FROM CTE 

La partie récursive de la requête renvoie toutes les catégories de l'enfant au niveau parent. La requête utilise FOR XML PATH afin de concaténer les noms de catégories dans l'ordre inverse (c'est-à-dire de parent à enfant).

REPLACE est utilisé car le caractère '>' est rendu 'gt;' de FOR XML PATH .