所以我在过去一小时左右一直在努力解决这个问题
我正在编写一个脚本来提取一些很好的格式的数据供我在另一个进程中使用但我无法弄清楚这个特定的位(我不太习惯使用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
希望有人能帮到我这里!感谢
答案 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
。