SQL Server-从子级递归获取父级值

SQL Server-从子级递归获取父级值,sql,sql-server,hierarchical-data,recursive-query,Sql,Sql Server,Hierarchical Data,Recursive Query,所以在过去的一个小时左右我一直在努力解决这个问题 我正在编写一个脚本,以很好的格式提取一些数据,供我在另一个进程中使用,但我不太明白这一点(我不太使用SQL Server) 我有几个表,这些表都包含在这个脚本中,它们链接在一起以获得所有信息。所有这些表都只是使用了虚假的数据和名称,但它显示了结构 TBL分类 cat_id cat_name 1 Trousers 2 Tracksuits 3 Woolen tblCategoryHierarchy ch_pa

所以在过去的一个小时左右我一直在努力解决这个问题

我正在编写一个脚本,以很好的格式提取一些数据,供我在另一个进程中使用,但我不太明白这一点(我不太使用SQL Server)

我有几个表,这些表都包含在这个脚本中,它们链接在一起以获得所有信息。所有这些表都只是使用了虚假的数据和名称,但它显示了结构

TBL分类

cat_id  cat_name
1       Trousers
2       Tracksuits
3       Woolen
tblCategoryHierarchy

ch_parentid  ch_childid
0            1
1            2
2            3
我还有我的产品表,里面有cat_id

TBL产品

p_id  p_name       p_cat_id
1     Red Trouser  3
因此,我想显示产品id、名称和所有类别的层次结构,这些类别链接到tblProduct中的类别

因此,对于本例,它将显示:

id  name         cats
1   Red Trouser  Trousers > Tracksuits > Woolen
希望有人能帮我一把!谢谢

试试这个:

;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
查询的递归部分返回从子级到父级的所有类别。查询对XML路径使用
,以便以相反的级别顺序(即从父级到子级)连接类别名称


之所以使用
REPLACE
,是因为
'>'
字符被呈现为
'gt;'
from
FOR XML PATH

您要查找的术语是“递归cte”。这类问题在互联网上已经被回答了数百次。然后,要在单个列中获得类别列表,您需要使用STUFF,而对于XMLThis,这非常有效!我不得不稍微修改一下,然后发现我使用的数据有一些类别指向它自己的孩子,所以它陷入了一个循环。。。哦,好吧!谢谢你的代码!公认的答案