有点复杂这个问题,今天搞着搞着把自己弄乱了。
先把需要的网页放进来
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,'')
就少了个/