香港云主机最佳企业级服务商!

ADSL拨号VPS包含了中国大陆(联通,移动,电信,)

中国香港,国外拨号VPS。

当前位置:云主机 > MSSQL >

电信ADSL拨号VPS
联通ADSL拨号VPS
移动ADSL拨号VPS

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


时间:2020-10-31 14:16 作者:admin610456


示例问题如下:
表结构:
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
(责任编辑:admin)






帮助中心
会员注册
找回密码
新闻中心
快捷通道
域名登录面板
虚机登录面板
云主机登录面板
关于我们
关于我们
联系我们
联系方式

售前咨询:17830004266(重庆移动)

企业QQ:383546523

《中华人民共和国工业和信息化部》 编号:ICP备00012341号

Copyright © 2002 -2018 香港云主机 版权所有
声明:香港云主机品牌标志、品牌吉祥物均已注册商标,版权所有,窃用必究

云官方微信

在线客服

  • 企业QQ: 点击这里给我发消息
  • 技术支持:383546523

  • 公司总台电话:17830004266(重庆移动)
  • 售前咨询热线:17830004266(重庆移动)