一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Sql Server - 三種實現方法實現數據表中遍歷尋找子節點

三種實現方法實現數據表中遍歷尋找子節點

2019-10-31 15:49mssql教程網 Sql Server

數據表中遍歷尋找子節點的三種實現方法:

示例問題如下:  
表結構:  
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  

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 天天干天天操天天爽 | 免费观看a毛片一区二区不卡 | 亚洲精品久久久久AV无码 | 欧洲美女女同 | 亚洲国产免费观看视频 | 丝瓜草莓香蕉绿巨人幸福宝 | 亚洲午夜精品久久久久久人妖 | 日韩欧美高清一区 | www.com在线观看| 国产人妖ts在线视频网 | 免费成年人在线视频 | 好大好爽好硬我要喷水了 | a亚洲天堂 | 国产草逼视频 | 青青国产成人久久91网 | 国产免费久久精品 | 国产欧美一区二区成人影院 | 日本xxxx18vr69 | 4hu影院在线观看 | 青春草视频免费观看 | 精品视频网站 | ffyybb免费福利视频 | 99re5在线精品视频热线 | 日韩成人小视频 | 亚洲精品一区在线观看 | 精品一区二区三区视频 | 午夜影院c绿象 | 欧美老女人b | 色卡7707c| 春色视频网站 | 国产在线视频在线观看 | 欧美性高清另类videosex死尸 | 91免费永久在线地址 | 婷婷丁香色综合狠狠色 | 日韩欧美在线一区二区三区 | 青青草国产一区二区三区 | 无耻三级在线观看 | 亚洲天堂精品在线观看 | 国产成+人+综合+亚洲不卡 | 青青草99| 亚洲国产精品综合久久一线 |