SQL Server-从子级递归获取父级值
所以在过去的一个小时左右我一直在努力解决这个问题 我正在编写一个脚本,以很好的格式提取一些数据,供我在另一个进程中使用,但我不太明白这一点(我不太使用SQL Server) 我有几个表,这些表都包含在这个脚本中,它们链接在一起以获得所有信息。所有这些表都只是使用了虚假的数据和名称,但它显示了结构 TBL分类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
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;'
fromFOR XML PATH
您要查找的术语是“递归cte”。这类问题在互联网上已经被回答了数百次。然后,要在单个列中获得类别列表,您需要使用STUFF,而对于XMLThis,这非常有效!我不得不稍微修改一下,然后发现我使用的数据有一些类别指向它自己的孩子,所以它陷入了一个循环。。。哦,好吧!谢谢你的代码!公认的答案