with cte as
(
select Id,Pid,DeptName,0 as lvl from Department
where Id = 2
union all
select d.Id,d.Pid,d.DeptName,lvl+1 from cte c inner join Department d
on c.Id = d.Pid
)
select * from cte
--------------------------------------------------- 以上为SQL语句
Id Pid DeptName
----------- ----------- -------------------------------
1 0 总部
2 1 研发部
3 1 测试部
4 1 质量部
5 2 小组1
6 2 小组2
7 3 测试1
8 3 测试2
9 5 前端组
10 5 美工
---------------------------------------------------- 以上为表结构
Id Pid DeptName lvl
----------- ----------- -------------------------------------------------- -----------
2 1 研发部 0
5 2 小组1 1
6 2 小组2 1
9 5 前端组 2
10 5 美工 2
-------------------------------------------------------------------以上为结果集
那么请教,这条语句的执行过程是怎么样的。 =。=
特别是from cte这里。重复调用cte应该会死循环啊= =,是什么条件让这个递归退出了???
以上内容来自博客园博主忧忧夏天。如有冒犯请原谅=。=。
不怎么看得懂。。。
追答默认是设置最大递归为100,不会让你死循环的。
追问最大为100我知道,但我不明白这个语句的执行过程= =。
比如第一次执行到递归成员。 from cte时。SQLServer会继续调用cte。 然后cte又继续调用cte...完全看不明白在哪里退出了。。。
你学过其他语言中的递归函数的写法吗。
找不到就退出,回到原位
WITH cte (EmployeeID, ManagerID, Title) as
(
......
)
--Uses MAXRECURSION to limit the recursive levels to 2
SELECT *
FROM cte
OPTION (MAXRECURSION 2); 这里就限制了二级,而默认可不写,为100
java c++之类的高级语言函数递归很容易理解啊,但这个我始终看不明白。
比如select * from cte之后是第一次执行cte,首先执行定位点成员:
返回
1 0 总部
之后执行递归成员内链接查询。
这个时候又会执行cte.. cte并没有返回结果啊= =。 这不是死循环了吗。