三种实现方法实现数据表中遍历寻找子节点
2022-11-12 09:51:31
内容摘要
这篇文章主要为大家详细介绍了三种实现方法实现数据表中遍历寻找子节点,具有一定的参考价值,可以用来参考一下。
对此感兴趣的朋友,看看idc笔记做的技术笔记!示例问题如下:表结
文章正文
这篇文章主要为大家详细介绍了三种实现方法实现数据表中遍历寻找子节点,具有一定的参考价值,可以用来参考一下。
对此感兴趣的朋友,看看idc笔记做的技术笔记!
示例问题如下:表结构:IdParentId102132......针对该表结构解释如下:1的父节点为0,2的父节点为1,3的父节点为2......以此类推,要求给定一个父节点的值,比如1,用SQL语句查询的到该父结点下的所有子节点下面的Sql是在SqlServer下调试通过的,如果是Oracle,则有ConnectBy可以实现.建立测试表:DropTableDbTreeCreateTableDbTree([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@IdIntSet@Id=1---在次修改父节点Select*Into#TempFromDbTreeWhereParentIdIn(@Id)Select*Into#AllRowFromDbTreeWhereParentIdIn(@Id)--1,2WhileExists(Select*From#Temp)BeginSelect*Into#Temp2From#TempTruncateTable#TempInsertInto#TempSelect*FromDbTreeWhereParentIdIn(SelectIdFrom#Temp2)InsertInto#AllRowSelect*From#TempDropTable#Temp2EndSelect*From#AllRowOrderByIdDropTable#TempDropTable#AllRow实现方法二:代码如下:CreateTable#AllRow(IdInt,ParentIdInt)Declare@IdIntSet@Id=1---在次修改父节点Delete#AllRow--顶层自身InsertInto#AllRow(Id,ParentId)Select@Id,@IdWhile@@RowCount>0BeginInsertInto#AllRow(Id,ParentId)SelectB.Id,A.IdFrom#AllRowA,DbTreeBWhereA.Id=B.ParentIdAndNotExists(SelectIdFrom#AllRowWhereId=B.IdAndParentId=A.Id)EndDeleteFrom#AllRowWhereId=@IdSelect*From#AllRowOrderByIdDropTable#AllRow实现方法三:代码如下:在SqlServer2005中其实提供了CTE[公共表表达式]来实现递归:关于CTE的使用请查MSDNDeclare@IdIntSet@Id=3;---在次修改父节点WithRootNodeCTE(Id,ParentId)As(SelectId,ParentIdFromDbTreeWhereParentIdIn(@Id)UnionAllSelectDbTree.Id,DbTree.ParentIdFromRootNodeCTEInnerJoinDbTreeOnRootNodeCTE.Id=DbTree.ParentId)Select*FromRootNodeCTE注:关于三种实现方法实现数据表中遍历寻找子节点的内容就先介绍到这里,更多相关文章的可以留意
代码注释