三种实现方法实现数据表中遍历寻找子节点
发布日期:2022-02-03 11:57 | 文章来源:源码之家
表结构:
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,1) InsertIntoDbTree([Id],[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---在次修改父节点 Select*Into#TempFromDbTreeWhereParentIdIn(@Id) Select*Into#AllRowFromDbTreeWhereParentIdIn(@Id)--1,2
WhileExists(Select*From#Temp) Begin Select*Into#Temp2From#Temp TruncateTable#Temp
InsertInto#TempSelect*FromDbTreeWhereParentIdIn(SelectIdFrom#Temp2) InsertInto#AllRowSelect*From#Temp DropTable#Temp2 End Select*From#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
版权声明:本站文章来源标注为YINGSOO的内容版权均为本站所有,欢迎引用、转载,请保持原文完整并注明来源及原文链接。禁止复制或仿造本网站,禁止在非www.yingsoo.com所属的服务器上建立镜像,否则将依法追究法律责任。本站部分内容来源于网友推荐、互联网收集整理而来,仅供学习参考,不代表本站立场,如有内容涉嫌侵权,请联系alex-e#qq.com处理。
相关文章
上一篇:
一道sql面试题附答案
下一篇: