时间: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邮箱联系删除。
先看看效果图:先看看数据库表的设计,数据表主要包括ID,Name,ParentID这三项,其中ID是主键,ParentID对应节点的父节点:方法一:用递归遍历数
1、二叉树的三种遍历方式二叉树有三种遍历方式:先序遍历,中序遍历,后续遍历即:先中后指的是访问根节点的顺序eg:先序根左右中序左根右后序左右根遍历总体思路:将树
要实现对数据表中的数据进行操作,第一步就是要取得数据表中的数据,我们把上篇文章中的创建Store的方法也略作调整,让其从数据表中读取数据。复制代码代码如下:th
map的三种遍历方法!集合的一个很重要的操作---遍历,学习了三种遍历方法,三种方法各有优缺点~~复制代码代码如下:/**Tochangethistemplat
你可能想知道MySQL以下三种信息:查询结果信息:SELECT,UPDATE或DELETE语句影响的记录数。数据库和数据表的信息:包含了数据库及数据表的结构信息