博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL也能玩递归
阅读量:4312 次
发布时间:2019-06-06

本文共 1548 字,大约阅读时间需要 5 分钟。

最近在做项目的时候遇到一个表,将省市区都放到一个表里存储,通过父ID字段来表示省市区的关系。

创建表语句

CREATE TABLE [dbo].[Table_6](	[id1] [int] NOT NULL,	[name] [varchar](50) NOT NULL,	[id2] [int] NOT NULL) ON [PRIMARY]

插入数据

insert Table_6 select 1,'江苏',0 union all select 2,'南京',1 union allselect 3,'杭州',4 union allselect 4,'浙江',0 union allselect 5,'白下',2 union allselect 6,'余杭',3

查询结果为

图1

期望的结果

图2

如果该记录的id2能够在表内找到,则将id2对应的记录的名称与当前记录的名称拼接在一起,如果其上层记录的id2不为0,就继续往上找,直到找到其id2为0为止。要找到图1中的父节点很简单,用下面的语句即可。

select * from [Table_6] Ainner join [Table_6] B     on A.id2=B.id1

得到的结果是

图3

这里如果我们仅取图3中的第一列,第五列和最后一列

图4

将图1和图4一起看,会发现现在已经取得了图1中的每个记录的父记录,并且id1都是第一层记录的ID。图4中只有第2和3条记录的id2不为0,也就是说其还有父记录,如果将图4的结果集再和图1关联一次,那么就得到了下面的结果

图5

将图1、图4和图5合并起来看,然后按id1分组,就会发现将每个组中的name拼接起来就是期望的图2的结果了。上述的方法对于有限级有用,但是如果是无限级拼接又该怎么办呢。

在SQL Server 2005中提供了公用表表达式(CTE),这个类似于表变量,但是比表变量效率高,通过它可以实现递归访问表的效果,例如要一次得到图1、图4和图5的结果

WITH cte AS ( 	SELECT [level]=1,id1, name, id2 from [Table_6]    	UNION ALL    	SELECT [level]=[level]+1, A.id1, b.name, b.id2     	FROM cte A  	INNER JOIN [Table_6] B             	ON A.id2 = B.id1 ) select * from cte order by id1

得到的结果是:

最后如果要得到图2的结果,给出完整的SQL语句

WITH cte AS ( 	SELECT [level]=1,id1, name, id2 from [Table_6]    	UNION ALL    	SELECT [level]=[level]+1, A.id1, b.name, b.id2     	FROM cte A  	INNER JOIN [Table_6] B             	ON A.id2 = B.id1 ) SELECT A.id1, name = STUFF((SELECT '-'+name FROM cte B WHERE b.id1=a.id1 ORDER BY [level] DESC FOR XML PATH('')),1,1,''), id2 = MAX(CASE WHEN [level]=1 THEN id2 END) FROM cte A GROUP BY id1

 

 

转载于:https://www.cnblogs.com/james1207/p/3271434.html

你可能感兴趣的文章
面试题5:字符串替换空格
查看>>
JSP九大内置对象及四个作用域
查看>>
ConnectionString 属性尚未初始化
查看>>
数据结构-栈 C和C++的实现
查看>>
发布功能完成
查看>>
MySQL基本命令和常用数据库对象
查看>>
poj 1222 EXTENDED LIGHTS OUT(位运算+枚举)
查看>>
秘密:之所以不搞军事同盟,俄罗斯
查看>>
进程和线程概念及原理
查看>>
Lucene、ES好文章
查看>>
后视镜应该这样用!能帮避免80%的车祸!
查看>>
PDB调试python代码常用命令
查看>>
web性能优化-浏览器渲染原理
查看>>
Java第七次作业
查看>>
配置consul为windows服务
查看>>
架构之美阅读笔记02
查看>>
Mac中安装Vim7.4
查看>>
VC++工程文件说明
查看>>
C#基础(string)
查看>>
JavaScript-06-Dom操作
查看>>