我是第一次使用CTE,我尝试使用递归来获取父树,但我无法正确获得结果。
我已经在这里寻求帮助并尝试了不同的方法来停止递归,但都失败了。
我正在使用 SQL Server 来运行它。
这是我用于测试的表的定义:
create table recursiveQuery
(id numeric(13),
name varchar(50),
parent numeric(13),
parentName varchar(50)
)
这是要查询的数据:
insert into recursiveQuery values(1, 'QQQ', NULL, NULL)
insert into recursiveQuery values(44, 'MMM', 1, 'QQQ')
insert into recursiveQuery values(33, 'AAA', 44, 'MMM')
insert into recursiveQuery values(22, 'GGG', 33, 'AAA')
insert into recursiveQuery values(55, 'JJJ', 33, 'AAA')
insert into recursiveQuery values(66, 'PPP', 1, 'QQQ')
这是我到目前为止编写的查询,但我只得到树的第一行。 所有子节点都丢失了,我真的不知道我做错了什么。
我希望结果具有完整的自上而下的父子路径,如 varchar 所示:“QQQ -> MMM -> AAA -> GGG”(但适用于所有记录)。我不知道这是否需要很长时间才能运行。
如果这是不可能的,我希望查询能够以一种简单的方式来识别父子路径。
WITH parent_tree AS (
SELECT
id, name, parent, parentName, 1 as level
FROM recursiveQuery m
WHERE parent is null
UNION ALL
SELECT
rr.id, rr.name, rr.parent, rr.parentName, level + 1 as level
FROM recursiveQuery rr
inner JOIN parent_tree r
ON r.parent = rr.id
)
SELECT *
FROM parent_tree
order by level
option(MAXRECURSION 0)
@DaleK 在评论中指出了这一点 - 你的加入标准是倒退的。但我来这里是为了向您展示我编写此类查询的方式,以便更容易发现。具体来说,将 cte 的递归部分中的表/cte 别名为父级和子级。像这样:
WITH parent_tree AS (
SELECT
id, name, parent, parentName, 1 as level
FROM #recursiveQuery m
WHERE parent is null
UNION ALL
SELECT
child.id, child.name, child.parent, child.parentName, level + 1 as level
FROM #recursiveQuery as child
inner JOIN parent_tree as parent
--ON parent.parent = child.id
on child.parent = parent.id
)
SELECT *
FROM parent_tree
order by level
我留下了你原来的注释行。注意到匹配父母的父母感觉很奇怪吗?应该的,因为这不是你想要的!父/子只是一个例子 - 重点是使用别名来使关系变得明显。