SQL Server 中使用 CTE 的递归不起作用

问题描述 投票:0回答:1

我是第一次使用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)
sql sql-server recursion common-table-expression
1个回答
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

我留下了你原来的注释行。注意到匹配父母的父母感觉很奇怪吗?应该的,因为这不是你想要的!父/子只是一个例子 - 重点是使用别名来使关系变得明显。

© www.soinside.com 2019 - 2024. All rights reserved.