服务器之家

服务器之家 > 正文

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

时间:2019-10-31 15:49     来源/作者:mssql教程网

示例问题如下:  
表结构:  
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  

相关文章

热门资讯

玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分 2019-06-21
男生常说24816是什么意思?女生说13579是什么意思?
男生常说24816是什么意思?女生说13579是什么意思? 2019-09-17
华为nova5pro和p30pro哪个好 华为nova5pro和华为p30pro对比详情
华为nova5pro和p30pro哪个好 华为nova5pro和华为p30pro对比详情 2019-06-22
超A是什么意思 你好a表达的是什么
超A是什么意思 你好a表达的是什么 2019-06-06
抖音撒撒累累是什么歌 撒撒累累张艺兴歌曲名字
抖音撒撒累累是什么歌 撒撒累累张艺兴歌曲名字 2019-06-05
返回顶部