加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 09:38:41 所属栏目:MsSql教程 来源:网络整理
导读:示例问题如下: 表结构: IdParentId 10 21 32 ......针对该表结构解释如下: 1的父节点为0, 2的父节点为1, 3的父节点为2 ...... 以此类推,要求给定一个父节点的值,比如1, 用SQL语句查询的到该父结点下的所有子节点 下面的Sql是在SqlServer下调试通过的,如果是

示例问题如下:
表结构:
IdParentId
10
21
32
......针对该表结构解释如下:
1的父节点为0,
2的父节点为1,
3的父节点为2
......
以此类推,要求给定一个父节点的值,比如1,
用SQL语句查询的到该父结点下的所有子节点 下面的Sql是在SqlServer下调试通过的,如果是Oracle,则有ConnectBy可以实现.
建立测试表: DropTableDbTree CreateTableDbTree ( [Id]Int,[Name]NVarChar(20),[ParentId]Int )
插入测试数据: InsertIntoDbTree([Id],[ParentId])Values(1,0) InsertIntoDbTree([Id],[ParentId])Values(2,1) InsertIntoDbTree([Id],[ParentId])Values(3,[ParentId])Values(4,3) InsertIntoDbTree([Id],[ParentId])Values(5,4) InsertIntoDbTree([Id],[ParentId])Values(6,7) InsertIntoDbTree([Id],[ParentId])Values(8,5) 实现方法一:
代码如下: Declare@IdInt Set@Id=1---在次修改父节点 SelectInto#TempFromDbTreeWhereParentIdIn(@Id) SelectInto#AllRowFromDbTreeWhereParentIdIn(@Id)--1,2
WhileExists(SelectFrom#Temp) Begin SelectInto#Temp2From#Temp TruncateTable#Temp
InsertInto#TempSelectFromDbTreeWhereParentIdIn(SelectIdFrom#Temp2) InsertInto#AllRowSelectFrom#Temp DropTable#Temp2 End SelectFrom#AllRowOrderById
DropTable#Temp DropTable#AllRow
实现方法二:
代码如下: CreateTable#AllRow ( IdInt,ParentIdInt )
Declare@IdInt Set@Id=1---在次修改父节点
Delete#AllRow
--顶层自身 InsertInto#AllRow(Id,ParentId)Select@Id,@Id
While@@RowCount>0 Begin InsertInto#AllRow(Id,ParentId) SelectB.Id,A.Id From#AllRowA,DbTreeB WhereA.Id=B.ParentIdAnd NotExists(SelectIdFrom#AllRowWhereId=B.IdAndParentId=A.Id) End
DeleteFrom#AllRowWhereId=@Id Select
From#AllRowOrderById DropTable#AllRow
实现方法三:
代码如下: 在SqlServer2005中其实提供了CTE[公共表表达式]来实现递归: 关于CTE的使用请查MSDN Declare@IdInt Set@Id=3;---在次修改父节点
WithRootNodeCTE(Id,ParentId) As ( SelectId,ParentIdFromDbTreeWhereParentIdIn(@Id) UnionAll SelectDbTree.Id,DbTree.ParentIdFromRootNodeCTE InnerJoinDbTree OnRootNodeCTE.Id=DbTree.ParentId )
Select*FromRootNodeCTE

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读