三种实现方法实现数据表中遍历寻找子节点

2016-02-19 10:44 4 1 收藏

每个人都希望每天都是开心的,不要因为一些琐事扰乱了心情还,闲暇的时间怎么打发,关注图老师可以让你学习更多的好东西,下面为大家推荐三种实现方法实现数据表中遍历寻找子节点,赶紧看过来吧!

【 tulaoshi.com - 编程语言 】

示例问题如下: 
表结构:  
Id ParentId 
1 0 
2 1 
3 2 
......  

针对该表结构解释如下: 
1的父节点为0, 
2的父节点为1, 
3的父节点为2 
...... 


以此类推,要求给定一个父节点的值,比如1, 


用SQL语句查询的到该父结点下的所有子节点 

 

下面的Sql是在Sql Server下调试通过的,如果是Oracle,则有Connect By可以实现. 


建立测试表: 

 

Drop Table DbTree 

Create Table DbTree 



[Id] Int, 

[Name] NVarChar(20), 

[ParentId] Int 



 


插入测试数据: 

 

Insert Into DbTree ([Id],[ParentId]) Values (1,0) 

Insert Into DbTree ([Id],[ParentId]) Values (2,1) 

Insert Into DbTree ([Id],[ParentId]) Values (3,1) 

Insert Into DbTree ([Id],[ParentId]) Values (4,3) 

Insert Into DbTree ([Id],[ParentId]) Values (5,4) 

Insert Into DbTree ([Id],[ParentId]) Values (6,7) 

Insert Into DbTree ([Id],[ParentId]) Values (8,5) 

 

实现方法一: 


代码如下: 

 

Declare @Id Int 

Set @Id = 1 ---在次修改父节点 

Select * Into #Temp From DbTree Where ParentId In (@Id) 

Select * Into #AllRow From DbTree Where ParentId In (@Id) --1,2 


While Exists(Select * From #Temp) 

Begin 

Select * Into #Temp2 From #Temp 

Truncate Table #Temp 


Insert Into #Temp Select * From DbTree Where ParentId In (Select Id From #Temp2) 

Insert Into #AllRow Select * From #Temp 

Drop Table #Temp2 

End 

Select * From #AllRow Order By Id 


Drop Table #Temp 

Drop Table #AllRow 

 

 


实现方法二: 


代码如下: 

 

Create Table #AllRow 



Id Int, 

ParentId Int 




Declare @Id Int 

Set @Id = 1 ---在次修改父节点 


Delete #AllRow 


--顶层自身 

Insert Into #AllRow (Id,ParentId) Select @Id, @Id 


While @@RowCount  0 

Begin 

Insert Into #AllRow (Id,ParentId) 

Select B.Id,A.Id 

From #AllRow A,DbTree B 

Where A.Id = B.ParentId And 

Not Exists (Select Id From #AllRow Where Id = B.Id And ParentId = A.Id) 

End 


Delete From #AllRow Where Id = @Id 

Select * From #AllRow Order By Id 

Drop Table #AllRow 

 


实现方法三: 


代码如下: 

 

在Sql Server2005中其实提供了CTE[公共表表达式]来实现递归: 

关于CTE的使用请查MSDN 

Declare @Id Int 

Set @Id = 3; ---在次修改父节点 


With RootNodeCTE(Id,ParentId) 

As 



Select Id,ParentId From DbTree Where ParentId In (@Id) 

Union All 

Select DbTree.Id,DbTree.ParentId From RootNodeCTE 

Inner Join DbTree 

On RootNodeCTE.Id = DbTree.ParentId 




Select * From RootNodeCTE 

来源:https://www.tulaoshi.com/n/20160219/1595599.html

延伸阅读
标签: SQLServer
create table common_info( name varchar(10), value int) insert into common_info values('msg_count', 100) 你的sql应该这么写(用存储过程): create proc p_ins_alm_msg     @msg_count     int out as     select @msg_count = value from common_info where name = 'msg_count'     upd...
标签: Web开发
前一段时间听朋友说起过打印网页的一些方法,在安静的夜晚,听着歌曲无意间发现了几段代码,帖出来跟大家分享一下。 因为我从来没有打印过网页,而且也没有打印机,具体的效果也不是很清楚,测试打印成PDF是正常的,就第二种在弹出设置窗口比第一跟第三种方法多了点。 注意:第二种方法的控件需要IE5.5+的支持,而且因为使用了控件,如果客户...
MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库里,由mysql_install_db脚本初始化。这些权限表分别user,db,table_priv,columns_priv和host。下面分别介绍一下这些表的结构和内容: user权限表:记录允许连接到服务器的用户帐号信息,里面的权限是全局级的。 db权限表:记录各个帐号在各个数据库上...
---- Windows下串行通信 ---- 与以往DOS下串行通信程序不同的是,Windows不提倡应用程序直接控制硬件,而是通过Windows操作系统提供的设备驱动程序来进行数据传递。串行口在Win 32中是作为文件来进行处理的,而不是直接对端口进行操作,对于串行通信,Win 32 提供了相应的文件I/O函数与通信函数,通过了解这些函数的使用,可以编制出符合不同...
标签: MySQL mysql数据库
以前在群里讨论过这个问题,比较的有意思.mysql的语法真好玩.他们原来都想用PHP的实现随机,但取出多条好像要进行两次以上查询.翻了手册,找到了下面这个语句,可以完成任务了。 SELECT * FROM table_name ORDER BY rand() LIMIT 5; rand在手册里是这么说的: RAND() ,RAND(N) :返回在范围0到1.0内的随机浮点值。如果一个整数参数N被指...

经验教程

703

收藏

56
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部