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

时间:2021-05-23

示例问题如下:
表结构:
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

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章