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;'
所以我在过去一个小时左右一直在努力解决这个问题
我正在编写一个脚本来提取一些格式良好的数据供我在另一个进程中使用,但我不太明白这个特定的位(我不经常使用 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;'