SQL 服务器 - 以递归方式从子项获取父项值

SQL Server - Get Parent values from Child recursively

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

我正在编写一个脚本来提取一些格式良好的数据供我在另一个进程中使用,但我不太明白这个特定的位(我不经常使用 SQL 服务器)

我有好几个 table 都涉及到这个脚本,link 一起获取所有信息。所有这些 table 都只是使用假数据和名称,但它显示了希望的结构

tbl类别

cat_id  cat_name
1       Trousers
2       Tracksuits
3       Woolen

tblCategoryHierarchy

ch_parentid  ch_childid
0            1
1            2
2            3

我也有我的产品 table,里面有 cat_id

tblProduct

p_id  p_name       p_cat_id
1     Red Trouser  3

因此,我想显示所有类别的产品 ID、名称和层次结构 linked 到 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

查询的递归部分returns 从子级别到父级别的所有类别。该查询使用 FOR XML PATH 以反向级别顺序连接类别名称(即从父级到子级)。

使用

REPLACE 是因为 '>' 字符从 FOR XML PATH.

呈现为 'gt;'