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

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

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  

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 福利片免费一区二区三区 | 亚洲另类老妇videos | 亚洲色图欧美视频 | 高h短篇辣肉各种姿势bl | 99这里只有精品66视频 | julianann在厨房 | 亚洲天堂免费观看 | 国产一区二区视频免费 | 国内自拍网红在线综合 | 91碰碰| 人妖巨茎video | 天天快乐高清在线观看 | 99草视频 | 蜜汁肉桃全文免费阅读 | 日本成人高清视频 | 视频在线视频免费观看 | 国产欧美另类 | 女主被当众调教虐np | 99热在这里只有精品 | 动漫美女隐私尿口图片 | 久草在在线免视频在线观看 | 超碰成人在线播放 | 国产麻豆精品视频 | 成人啪啪漫画全文阅读 | 男人在线影院 | 欧美另类xxx精品人妖 | 国产一级特黄在线播放 | 国内精品91最新在线观看 | 亚洲精品国产精品国自产观看 | 精品麻豆国产 | 青青青青青操 | 91免费在线 | 免费一级特黄特色大片 | 国产精品久久久久久爽爽爽 | 91男人 | 日本黄大片影院一区二区 | 亚洲国产无线码在线观看 | 都市风流贵妇激情 | 亚洲国产成人久久精品影视 | 日本福利视频一区 | 催眠 迷j系列小说 |