首页 新闻 会员 周边 捐助

这种错误是什么 递归 求大神

0
[待解决问题]

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 朋口镇

龙o魂的主页 龙o魂 | 初学一级 | 园豆:198
提问于:2015-08-14 18:05
< >
分享
所有回答(2)
0

这和递归有个毛关系,你乱用union 、join ,当然会乱死了

代码小兵的成长 | 园豆:303 (菜鸟二级) | 2015-08-15 15:07

他的是CTEs的递归哦,你看错了哦

支持(0) 反对(0) 稳稳的河 | 园豆:4216 (老鸟四级) | 2015-08-17 09:38

那能指点下哪里错了吗  谢了

支持(0) 反对(0) 龙o魂 | 园豆:198 (初学一级) | 2015-08-17 10:06
0

第一个锚点你定义的是select id,pid,name from f,就是普通的sql,第2个语句就是递归了,from t的t它不只是代表了一个结果,实际上代表了一系列的结果,第一次递归是和锚点结合(t0),第2次是to与f的的结合,依次类推把,直到结束,你也写了一个防止无限循环的查询,为什么是上面的结果,你自己去定位下吧

稳稳的河 | 园豆:4216 (老鸟四级) | 2015-08-17 10:40
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册