SQL Sever父级递归

有点复杂这个问题,今天搞着搞着把自己弄乱了。

先把需要的网页放进来

https://blog.csdn.net/u011872945/article/details/14452641

这个人在SQL Sever里面写了函数,可以由子节点查找父节点,也可以由父节点查找所有子节点。很厉害,而且还用了递归。

https://zhidao.baidu.com/question/1495468298825553659.html

偶然看到这个问题下面的答案,感觉有些厉害。我一直对于递归的过程没有太熟悉,稍微复杂一点我就蒙圈了。这次我选择一步步还原CTE。https://zhidao.baidu.com/question/457085519108307205.html

还原后稍微懂了些,可这位大神的select部分有些霸道,不明白,我改天有时间再来好好学习,先记下了。

为了还原CTE中的递归过程,就是傻瓜一样建新表。test1,test2。还学到了 SQL Sever中国的STUFF 和 FRO XML PATH。

将一列的多行内容拼接成一行的问题讨论,stuff以及for xml path的联合使用,优秀。
拆解
--1.
select 1 leave,parent,地点,cast('' as varchar(10)) r from hf
leave	parent	地点	r
1	0	中国	
1	1	广东	
1	1	安徽	
1	1	河南	
1	1	河北	
1	100	深圳	
1	100	广州	
1	10001	深圳A区	
1	10001	深圳B区	
--2.
WITH t as (select 1 leave,parent,地点,cast('' as varchar(10)) r from hf)
select *
FROM hf c
INNER JOIN t on c.Dept_code=t.parent

Dept_code	parent	地点	leave	parent1	地点1	r
1	0	中国	1	1	广东	
1	0	中国	1	1	安徽	
1	0	中国	1	1	河南	
1	0	中国	1	1	河北	
100	1	广东	1	100	深圳	
100	1	广东	1	100	广州	
10001	100	深圳	1	10001	深圳A区	
10001	100	深圳	1	10001	深圳B区	

WITH t as (select 1 leave,parent,地点,cast('' as varchar(10)) r from hf)
select t.leave+1 leave,c.parent,t.地点 '地点',c.地点 r
FROM hf c
INNER JOIN t on c.Dept_code=t.parent

CREATE TEMPORARY TABLE 
leave	parent	地点	r
1	0	中国	
1	1	广东	
1	1	安徽	
1	1	河南	
1	1	河北	
1	100	深圳	
1	100	广州	
1	10001	深圳A区	
1	10001	深圳B区	
2	0	广东	中国
2	0	安徽	中国
2	0	河南	中国
2	0	河北	中国
2	1	深圳	广东
2	1	广州	广东
2	100	深圳A区	深圳
2	100	深圳B区	深圳

create table test1
(leave varchar(10), 
 parent varchar(10),
 地点 varchar(10), 
 r varchar(10));

SELECT * INTO test1
FROM
(select 1 leave,parent,地点,cast('' as varchar(10)) r from hf) aa

WITH t as (select 1 leave,parent,地点,cast('' as varchar(10)) r from hf)
INSERT INTO test1 
SELECT * 
FROM
		(select t.leave+1 leave,c.parent,t.地点 '地点',c.地点 r
		FROM hf c
		INNER JOIN t on c.Dept_code=t.parent
		) bb


INSERT INTO test2
select test1.leave+1 leave,c.parent,test1.地点 '地点',c.地点 r
FROM hf c
INNER JOIN test1 on c.Dept_code=test1.parent

Dept_code	parent	地点	leave	parent1	地点1	r
1	0	中国	1	1	广东	
1	0	中国	1	1	安徽	
1	0	中国	1	1	河南	
1	0	中国	1	1	河北	
100	1	广东	1	100	深圳	
100	1	广东	1	100	广州	
10001	100	深圳	1	10001	深圳A区	
10001	100	深圳	1	10001	深圳B区	
1	0	中国	2	1	深圳	广东
1	0	中国	2	1	广州	广东
100	1	广东	2	100	深圳A区	深圳
100	1	广东	2	100	深圳B区	深圳

test2表就是CTE的结果

select d.地点,
 stuff((select '/'+r from test2 e 
        where e.地点=d.地点
        order by leave desc 
        for xml path('')),1,1,'')+d.地点 'paths'
 from test2 d group by d.地点

select '/'+r from test2 for xml path('');

select stuff((select '/'+r from test2 for xml path('')),1,1,'')
就少了个/

猜你喜欢

转载自blog.csdn.net/dufemt/article/details/81069514
今日推荐