SQL Server - 以递归方式从Child获取父值

时间:2017-01-05 15:17:21

标签: sql sql-server hierarchical-data recursive-query

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

我正在编写一个脚本来提取一些很好的格式的数据供我在另一个进程中使用但我无法弄清楚这个特定的位(我不太习惯使用SQL Server) )

我已经有几个表都参与了这个脚本,它们链接在一起以获取所有信息。所有这些表只是使用虚假数据和名称,但它有希望显示结构

tblCategories

cat_id  cat_name
1       Trousers
2       Tracksuits
3       Woolen

tblCategoryHierarchy

ch_parentid  ch_childid
0            1
1            2
2            3

我还有我的产品表,里面有cat_id

tblProduct

p_id  p_name       p_cat_id
1     Red Trouser  3

因此,我希望显示链接到tblProduct中的所有类别的产品ID,名称和层次结构。

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

id  name         cats
1   Red Trouser  Trousers > Tracksuits > Woolen

希望有人能帮到我这里!感谢

1 个答案:

答案 0 :(得分:3)

试试这个:

;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

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

使用

REPLACE是因为'>'字符从'gt;'呈现为FOR XML PATH