我有一个带有自引用表的SQL Server数据库。结构的深度可以在1到20 之间
- ID-主键
- 名称-nvarchar(256(
- ParentID-int
典型数据:
Id | 名称 | ParentId|
---|---|---|
1 | 文件夹1 | 空|
2 | 文件夹2 | 1 |
3 | 文件夹3 | 2 |
4 | 文件夹4 | 3 |
首先,您正在尝试筛选值在错误的地方。这不应该在CTE中完成,而应该在主查询中完成,因为CTE用于构建树并生成Name
值。
其次,在加入CTE时,递归部分的CTE中出现错误。你有on parent.ParentId = a.Id
,但你需要相反的on a.ParentId = parent.Id
。
所以你的查询会像这个
declare @id int;
set @id = 4;
WITH folder_tree AS (
SELECT
id,
CAST(name AS nvarchar(max)) AS name,
parentid
FROM folders
WHERE parentid IS NULL
UNION ALL
SELECT
f.id,
CAST(ft.name + '/' + f.name AS nvarchar(max)),
f.parentid
FROM folders f
JOIN folder_tree ft ON f.parentid = ft.id
)
SELECT * FROM folder_tree
WHERE id = @id
查询输出
id | name | parentid |
---|---|---|
4 | Folder1/Folder2/Folder3/Folder4 | 3 |