create table tb(id varchar(3) , pid varchar(3) , name varchar(10))
insert into tb values('001' , null  , '广东省')
insert into tb values('002' , '001' , '广州市')
insert into tb values('003' , '001' , '深圳市')
insert into tb values('004' , '002' , '天河区')
insert into tb values('005' , '003' , '罗湖区')
insert into tb values('006' , '003' , '福田区')
insert into tb values('007' , '003' , '宝安区')
insert into tb values('008' , '007' , '西乡镇')
insert into tb values('009' , '007' , '龙华镇')
insert into tb values('010' , '007' , '松岗镇')
go--查询各节点的父路径函数(从父到子)
create function f_pid1(@id varchar(3)) returns varchar(100)
as
begindeclare @re_str as varchar(100)set @re_str = ''select @re_str = name from tb where id = @idwhile exists (select 1 from tb where id = @id and pid is not null)beginselect @id = b.id , @re_str = b.name + ',' + @re_str from tb a , tb b where a.id = @id and a.pid = b.idendreturn @re_str
end
go
--查询各节点的父路径函数(从子到父)
create function f_pid2(@id varchar(3)) returns varchar(100)
as
begindeclare @re_str as varchar(100)set @re_str = ''select @re_str = name from tb where id = @idwhile exists (select 1 from tb where id = @id and pid is not null)beginselect @id = b.id , @re_str = @re_str + ',' + b.name from tb a , tb b where a.id = @id and a.pid = b.idendreturn @re_str
end
goselect * , dbo.f_pid1(id) [路径(从父到子)] ,dbo.f_pid2(id) [路径(从子到父)]
from tb order by iddrop function f_pid1 , f_pid2
drop table tb/*
id   pid  name    路径(从父到子)               路径(从子到父)
---- ---- ------  ---------------------------  ----------------------------
001  NULL 广东省  广东省                       广东省
002  001  广州市  广东省,广州市                广州市,广东省
003  001  深圳市  广东省,深圳市                深圳市,广东省
004  002  天河区  广东省,广州市,天河区         天河区,广州市,广东省
005  003  罗湖区  广东省,深圳市,罗湖区         罗湖区,深圳市,广东省
006  003  福田区  广东省,深圳市,福田区         福田区,深圳市,广东省
007  003  宝安区  广东省,深圳市,宝安区         宝安区,深圳市,广东省
008  007  西乡镇  广东省,深圳市,宝安区,西乡镇  西乡镇,宝安区,深圳市,广东省
009  007  龙华镇  广东省,深圳市,宝安区,龙华镇  龙华镇,宝安区,深圳市,广东省
010  007  松岗镇  广东省,深圳市,宝安区,松岗镇  松岗镇,宝安区,深圳市,广东省(所影响的行数为 10 行)
*/


/*
标题:SQL SERVER 2005中查询指定节点及其所有父节点的方法(字符串形式显示)
作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开)
时间:2010-02-02
地点:新疆乌鲁木齐
*/create table tb(id varchar(3) , pid varchar(3) , name nvarchar(10))
insert into tb values('001' , null  , N'广东省')
insert into tb values('002' , '001' , N'广州市')
insert into tb values('003' , '001' , N'深圳市')
insert into tb values('004' , '002' , N'天河区')
insert into tb values('005' , '003' , N'罗湖区')
insert into tb values('006' , '003' , N'福田区')
insert into tb values('007' , '003' , N'宝安区')
insert into tb values('008' , '007' , N'西乡镇')
insert into tb values('009' , '007' , N'龙华镇')
insert into tb values('010' , '007' , N'松岗镇')
go;with t as
(select id , pid = id from tb union allselect t.id , pid = tb.pid from t inner join tb on t.pid = tb.id
)
select id , [路径(从父到子)] = STUFF((SELECT ',' + pid FROM t WHERE id = tb.id order by t.id , t.pid FOR XML PATH('')) , 1 , 1 , ''),[路径(从子到父)] = STUFF((SELECT ',' + pid FROM t WHERE id = tb.id FOR XML PATH('')) , 1 , 1 , '')
from tb
group by id
order by id
/*
id   路径(从父到子)   路径(从子到父)
---- ---------------  ---------------
001  001              001
002  001,002          002,001
003  001,003          003,001
004  001,002,004      004,002,001
005  001,003,005      005,003,001
006  001,003,006      006,003,001
007  001,003,007      007,003,001
008  001,003,007,008  008,007,003,001
009  001,003,007,009  009,007,003,001
010  001,003,007,010  010,007,003,001(10 行受影响)
*/;with t as
(select id , name , pid = id , path = cast(name as nvarchar(100)) from tb union allselect t.id , t.name , pid = tb.pid , path = cast(tb.name as nvarchar(100)) from t join tb on tb.id = t.pid
)
select id , name ,[路径(从父到子)_1] = pid1, [路径(从父到子)_2] = reverse(substring(reverse(path1) , charindex(',' , reverse(path1)) + 1 , len(path1))) ,[路径(从子到父)_1] = pid2,[路径(从子到父)_2] = substring(path2 , charindex(',' , path2) + 1 , len(path2)) from
(
select id , name ,pid1 = STUFF((SELECT ',' + pid FROM t WHERE id = tb.id order by t.id , t.pid FOR XML PATH('')) , 1 , 1 , ''),pid2 = STUFF((SELECT ',' + pid FROM t WHERE id = tb.id FOR XML PATH('')) , 1 , 1 , ''),path1 = STUFF((SELECT ',' + path FROM t WHERE id = tb.id order by t.id , t.pid FOR XML PATH('')) , 1 , 1 , ''),path2 = STUFF((SELECT ',' + path FROM t WHERE id = tb.id FOR XML PATH('')) , 1 , 1 , '')
from tb
group by id , name
) m
order by id
/*
id   name    路径(从父到子)_1  路径(从父到子)_2             路径(从子到父)_1  路径(从子到父)_2
---- ------  ----------------  ---------------------------  ----------------  ---------------------------
001  广东省  001               广东省                       001               广东省
002  广州市  001,002           广东省,广州市                002,001           广州市,广东省
003  深圳市  001,003           广东省,深圳市                003,001           深圳市,广东省
004  天河区  001,002,004       广东省,广州市,天河区         004,002,001       天河区,广州市,广东省
005  罗湖区  001,003,005       广东省,深圳市,罗湖区         005,003,001       罗湖区,深圳市,广东省
006  福田区  001,003,006       广东省,深圳市,福田区         006,003,001       福田区,深圳市,广东省
007  宝安区  001,003,007       广东省,深圳市,宝安区         007,003,001       宝安区,深圳市,广东省
008  西乡镇  001,003,007,008   广东省,深圳市,宝安区,西乡镇  008,007,003,001   西乡镇,宝安区,深圳市,广东省
009  龙华镇  001,003,007,009   广东省,深圳市,宝安区,龙华镇  009,007,003,001   龙华镇,宝安区,深圳市,广东省
010  松岗镇  001,003,007,010   广东省,深圳市,宝安区,松岗镇  010,007,003,001   松岗镇,宝安区,深圳市,广东省(10 行受影响)
*/drop table tb

转载于:https://www.cnblogs.com/LCX/archive/2011/03/12/1982036.html

SQL Tree解法相关推荐

  1. pikachu靶场SQL,sqlmap解法

    GET型输入 字符型注入(此处细说): 随便输入点什么 URL http://192.168.56.1/pikachu2/vul/sqli/sqli_str.php?name=2121&sub ...

  2. SQL字符串中单引号与换行符的转义

    问题 打算将文本文件内容添加至MySQL数据库,则需要对文本中的单引号和换行符进行转义,否则无法编写合法的SQL. 解法 迭代文本文件的行时,将原行尾的换行符剔除掉,并拼接\\n; 迭代文本文件的行时 ...

  3. 比开源快30倍的自研SQL Parser设计与实践

    简介: SQL作为一种领域语言,最早用于关系型数据库,方便管理结构化数据:SQL由多种不同的类型的语言组成,包括数据定义语言,数据控制语言.数据操作语言:各数据库产品都有不同的声明和实现:用户可以很方 ...

  4. 利用hive源码解析sql查了哪些表哪些字段

    在hiveserver2中使用了org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer对抽象语法树(AST)进行语义分析,分析的过程可以得出hive查 ...

  5. Yearning sql审核平台docker化布署

    在一个云主机centos 7上布署线上环境和开发开发两套审核平台. 1.下载yearning sql安装文件: git clone https://github.com/cookieY/Yearnin ...

  6. 高级数据结构与算法 | AVL树 (高度平衡树)

    文章目录 AVL树 实现思路 数据结构 查找 平衡因子 旋转 右旋 左旋 右左双旋 左右双旋 插入 删除 AVL树的验证 中序遍历 平衡判断 AVL树的性能 完整代码实现 AVL树 AVL树是最先发明 ...

  7. Rafy 框架 - 使用 SqlTree 查询

    本文介绍如何使用 Rafy 框架中的 Sql Tree 查询: 除了开发者常用的 Linq 查询,Rafy 框架还提供了 Sql 语法树的方式来进行查询. 这种查询方式下,开发者不需要直接编写真正的 ...

  8. java 必备面试必备

    1.JDK 和 JRE 有什么区别? JDK(Java Development Kit),Java开发工具包 JRE(Java Runtime Environment),Java运行环境 JDK中包含 ...

  9. LeetCode 102. Binary Tree Level Order Traversal--递归,迭代-Python,Java解法

    题目地址: Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to ...

最新文章

  1. php用w获取的星期不对,php获取时间是星期几的方法是什么
  2. 【Linux 内核】CFS 调度器 ② ( CFS 调度器 “ 权重 “ 概念 | CFS 调度器调度实例 | 计算进程 “ 实际运行时间 “ )
  3. 【数理知识】特征值、特征向量、左特征向量
  4. 故障转移集群无法连接到节点_Redis集群以及自动故障转移测试
  5. jQuery中each的用法之退出循环和结束本次循环
  6. Python 分布式文件系统 Mongodb GridFS
  7. 从汇编角度看待函数调用
  8. 我的JavaWeb学习2
  9. 随想录(怎么阅读代码)
  10. 昨天1024程序员节,我故意写了个死循环~
  11. mysql int做主键_mysql5.5 uuid做主键与int做主键的性能实测
  12. wxPython练习
  13. ADB远程桌面连接本地手机
  14. 如何修改朋友圈定位到其他异地城市
  15. python身份证号码共18位_用Python写一个身份证号码校验工具
  16. mysql recordcount 1_移植到 MySQL-对 MYSQL 数据库使用 ASP Recordcount 的问题
  17. EA建模-绘制活动图
  18. 日常篇(持续更新ing)
  19. 到底是加瓦好还是C好呢?
  20. C++ + ubuntu 调用boost 的一个问题

热门文章

  1. 前端学习(3317):connect 2
  2. [html] 使用svg画一个三角形
  3. 前端学习(2868):vue3数据劫持解析3
  4. “约见”面试官系列之常见面试题之第七十七篇之vuex中mutation和action的详细区别 (建议收藏)
  5. 前端学习(1848)vue之电商管理系统电商系统的开发模式和技术选型
  6. 前端学习(903):js同步和异步
  7. java学习(130):treemap类
  8. iperf 测试局域网速度
  9. powermockito教程_Mockito与PowerMock的使用基础教程
  10. 弹性法计算方法的mck法_粘弹性自由阻尼加筋板的随机响应分析和试验研究