if exists(select * from sysobjects where name ='f')
drop table f
create table f(
id int,
pid int,
name varchar(20))
insert into f values(1,null,'福建省')
insert into f values(2,2,'厦门市')
insert into f values(3,2,'龙岩市')
insert into f values(4,3,'连城县')
insert into f values(5,3,'上杭县')
insert into f values(6,3,'长汀县')
insert into f values(7,4,'新泉镇')
insert into f values(8,4,'朋口镇')
select * from f
;with t as(
select id,pid,name from f
union all
select a.id,a.pid,a.name from t a join f on f.id=a.pid
)
select * from t
option(maxrecursion 10)
运行的结果
id pid name
1 NULL 福建省
2 2 厦门市
3 2 龙岩市
4 3 连城县
5 3 上杭县
6 3 长汀县
7 4 新泉镇
8 4 朋口镇
8 4 朋口镇
8 4 朋口镇
8 4 朋口镇
8 4 朋口镇
8 4 朋口镇
8 4 朋口镇
8 4 朋口镇
8 4 朋口镇
8 4 朋口镇
8 4 朋口镇
这和递归有个毛关系,你乱用union 、join ,当然会乱死了
他的是CTEs的递归哦,你看错了哦
那能指点下哪里错了吗 谢了
第一个锚点你定义的是select id,pid,name from f,就是普通的sql,第2个语句就是递归了,from t的t它不只是代表了一个结果,实际上代表了一系列的结果,第一次递归是和锚点结合(t0),第2次是to与f的的结合,依次类推把,直到结束,你也写了一个防止无限循环的查询,为什么是上面的结果,你自己去定位下吧