• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >Mysql > 三种实现方法实现数据表中遍历寻找子节点

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

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2018-12-05

匿名通过本文主要向大家介绍了三种实现方法,数据表中遍历等相关知识,希望本文的分享对您有所帮助

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

示例问题如下:
表结构:
Id ParentId
1 0
2 1
3 2
......

针对该表结构解释如下:
1的父节点为0,
2的父节点为1,
3的父节点为2
......


以此类推,要求给定一个父节点的值,比如1,


用SQL语句查询的到该父结点下的所有子节点



下面的Sql是在Sql Server下调试通过的,如果是Oracle,则有Connect By可以实现.


建立测试表:



Drop Table DbTree

Create Table DbTree

(

[Id] Int,

[Name] NVarChar(20),

[ParentId] Int

)




插入测试数据:



Insert Into DbTree ([Id],[ParentId]) Values (1,0)

Insert Into DbTree ([Id],[ParentId]) Values (2,1)

Insert Into DbTree ([Id],[ParentId]) Values (3,1)

Insert Into DbTree ([Id],[ParentId]) Values (4,3)

Insert Into DbTree ([Id],[ParentId]) Values (5,4)

Insert Into DbTree ([Id],[ParentId]) Values (6,7)

Insert Into DbTree ([Id],[ParentId]) Values (8,5)



实现方法一:


代码如下:



Declare @Id Int

Set @Id = 1 ---在次修改父节点

Select * Into #Temp From DbTree Where ParentId In (@Id)

Select * Into #AllRow From DbTree Where ParentId In (@Id) --1,2


While Exists(Select * From #Temp)

Begin

Select * Into #Temp2 From #Temp

Truncate Table #Temp


Insert Into #Temp Select * From DbTree Where ParentId In (Select Id From #Temp2)

Insert Into #AllRow Select * From #Temp

Drop Table #Temp2

End

Select * From #AllRow Order By Id


Drop Table #Temp

Drop Table #AllRow






实现方法二:


代码如下:



Create Table #AllRow

(

Id Int,

ParentId Int

)


Declare @Id Int

Set @Id = 1 ---在次修改父节点


Delete #AllRow


--顶层自身

Insert Into #AllRow (Id,ParentId) Select @Id, @Id


While @@RowCount > 0

Begin

Insert Into #AllRow (Id,ParentId)

Select B.Id,A.Id

From #AllRow A,DbTree B

Where A.Id = B.ParentId And

Not Exists (Select Id From #AllRow Where Id = B.Id And ParentId = A.Id)

End


Delete From #AllRow Where Id = @Id

Select * From #AllRow Order By Id

Drop Table #AllRow




实现方法三:


代码如下:



在Sql Server2005中其实提供了CTE[公共表表达式]来实现递归:

关于CTE的使用请查MSDN

Declare @Id Int

Set @Id = 3; ---在次修改父节点


With RootNodeCTE(Id,ParentId)

As

(

Select Id,ParentId From DbTree Where ParentId In (@Id)

Union All

Select DbTree.Id,DbTree.ParentId From RootNodeCTE

Inner Join DbTree

On RootNodeCTE.Id = DbTree.ParentId

)


Select * From RootNodeCTE
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

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

相关文章

  • 2018-12-05简单有用的SQL脚本 (行列互转,查询一个表内相同纪录等)
  • 2018-12-05总结MySQL计算年龄的五种方法及各自的优缺点
  • 2018-12-05关于MSSQL 2005的安装与补丁
  • 2018-12-05MySQL 实用命令
  • 2018-12-05【mysql教程】MySQL 导入数据
  • 2017-05-11MySQL数据库优化详解
  • 2018-12-05mysql中的跨库关联查询方法详解
  • 2018-11-02skip-grant-tables:mysql启动参数
  • 2018-12-05Mysql中创建用户帐户的方法
  • 2017-05-11master and slave have equal MySQL server UUIDs 解决方法

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • 介绍一个简单的数据库Database 教程(二)
    • mysql操作之常用操作——数据库和数据表的基本操作(1)共2课
    • 定时备份mysql, 定时切割nginx access log的方法
    • 如何写一个属于自己的数据库封装(2)
    • 给你的数据库文件减肥
    • MySQL数据库常见问题汇总
    • myslq 锁表问题的解决方法
    • MySQL异地增量备份
    • mysql学习之数据引擎的示例代码分享
    • 详解MySQL中的SQRT函数的使用方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有