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

弱氣氣酱

弱氣氣酱

2016-02-19 10:44

每个人都希望每天都是开心的,不要因为一些琐事扰乱了心情还,闲暇的时间怎么打发,关注图老师可以让你学习更多的好东西,下面为大家推荐三种实现方法实现数据表中遍历寻找子节点,赶紧看过来吧!
示例问题如下: 
表结构:  
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 
展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
三种实现方法实现数据表中遍历寻找子节点

Java中Decorate的三种实现方法

编程语言 网络编程
Java中Decorate的三种实现方法

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

用AdoDataSet实现数据表的导入导出

Delphi
用AdoDataSet实现数据表的导入导出

MYSQL使用.frm恢复数据表结构的实现方法

编程语言 网络编程
MYSQL使用.frm恢复数据表结构的实现方法

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

java中关于Map的三种遍历方法详解

编程语言 网络编程
java中关于Map的三种遍历方法详解

数据表中数据的管理

编程语言 网络编程
数据表中数据的管理

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

巧妙关闭Win8.1应用的最快方法

巧妙关闭Win8.1应用的最快方法

用SQL建立索引的方法步骤

用SQL建立索引的方法步骤
下拉加载更多内容 ↓