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

C#实现后序遍历多叉树 了解 后序遍历多叉树的原理:依次从左到右访问子节点,最后访问父节点 遍历结果:5672341 栈的基本原理(后进先出) 数据表结构及数据 menu_id为节点的ID menu_superior_id为节点的上一级ID,依据此ID关联到上一级节点 实现 实现思路 获取根节点下的所有子节点,使用栈,记录下次循环需要遍历的节点。 使用while循环遍历根节点下的子节点,直... 阅读详情

        以前公司的同事在QQ上发了个面试题过来,让我给看看.这个问题的巧妙实现,
几年前在一个很出名的Delphi论坛上见过.
感觉里面蕴含有很多SQL的技巧,所以整理了一下,希望对大家有帮助吧!

问题如下:

有表结构如下:
 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
oracle递归 遍历子节点 查询父节点 利用start with .. connect by prior 遍历子节点或者父节点 阅读详情

相关推荐

GPU运维基础知识

常见的GPU型号如NVIDIA Tesla系列(V100、A100)、GeForce RTX系列(3090、4090)和AMD Instinct系列(MI250X)。硬件监控工具包括NVIDIA的nvidia-smi和AMD的rocm-smi,用于实时监控GPU状态、温度、功耗和显存使用情况。NVIDIA和AMD是主流GPU供应商,NVIDIA的CUDA架构和AMD的ROCm生态是核心。GPU包含流处理器、显存、显存带宽等关键组件,不同型号的GPU在计算能力、显存容量和功耗上存在差异。

云原生运维的博客 765

Python爬虫(关联获取)获取子节点

在获取节点内容时,不一定都能做到一步获取指定节点中的内容,需要先确认某一个节点,然后以该节点为中心获取对应的子节点、孙节点、父节点、兄弟节点。通过head.contents所获取所有子节点有3个换行符\n以及两个子标题(title和,eta)对应的所有内容。contents所返回的是一个列表,在这个列表中每个元素都是一个子节点内容。children所返回的是一个list_iterator类型的可迭代对象。获取子节点,可以使用contents或children属性来实现。

2301_79857125的博客 796

2021秋-北邮计算机导论期末考试(BUPT)

2021秋-北邮计算机导论期末考试(BUPT) 难度较低适合新手练习

weixin_73985779的博客 1500

数据结构 一 树

树 树是由一个集合以及在该集合上定义的一种关系构成的。 集合中的元素称为树的结点,所定义的关系称为父子关系。 父子关系在树的结点之间建立了一个层次结构。 树的结点包含一个元素及若干指向其子树的若干分支。 在这种层次结构中有一个结点具有特殊的地位,这个结点称为该树的根结点,简称树根。 树是n(n>=0)个结点的有限集 空树(n=0),空树中不包含任何系结点 非空树(n>0),此时有且仅有一个特定的称为根的结点 当n>1时,其余结点可分为m(m>0)个互不相交的有限集,

sunny潘先生的博客 515

高效利用ChEMBL数据库:从靶点查询到活性数据处理的完整指南

本文提供了高效利用ChEMBL数据库的完整指南,从靶点查询到活性数据处理。详细介绍了靶点精准定位、高级过滤技巧、数据导出优化以及活性数据清洗、特征工程和可视化等实战技巧,帮助药物研发人员快速获取和处理生物活性数据,提升工作效率。

weixin_29278805的博客 801

AMEsim不连续处理机制:仿真精度与效率的平衡艺术

本文深入解析AMEsim不连续处理机制在系统仿真中的应用,探讨如何平衡仿真精度与效率。通过液压系统仿真案例,详细介绍了事件检测算法、变步长求解器自适应策略及典型场景优化方法,帮助工程师有效应对仿真中的不连续性问题,提升仿真效率和准确性。

v4w5x6的博客 442

html 遍历子节点,【EASYDOM系列教程】之遍历节点

Node 对象提供了一系列的属性和方法用来利用 DOM 节点树结构中节点的关系实现遍历其中的节点。关于节点之间的关系,可以参考《DOM树结构》一节有关节点之间关系的内容。获取父节点通过 HTML 页面中指定元素查找其父级节点,我们可以使用 Node 对象的 parentNode 属性实现:pNode = node.parentNode;在上述语法结构中,parentNode 属性返回指定节点的父节...

weixin_35851482的博客 1013

即插即用系列(代码实践) | CVPR 2025 FDConv:频域动态卷积,打破密集预测任务的参数效率瓶颈

本文提取自 CVPR 2025 的最新底层算子革新论文《Frequency Dynamic Convolution for Dense Image Prediction》。近年来,动态卷积(Dynamic Convolution)通过融合多个并行卷积核极大地提升了模型性能,但研究表明:这些并行卷积核在频域上的响应高度相似,导致了极其严重的参数浪费,且缺乏对不同频率特征的自适应能力。本文复现了该网络的核心架构——FDConv(频率动态卷积)。该方案创造性地在傅里叶域(Fourier Domain)中学习固定参

分享顶会顶刊论文即插即用模块 113

html 遍历子节点,js遍历子节点子元素附属性及方法

// 添加子节点前 删除所有子节点var usernameEle = document.getElementById("username");var childs = usernameEle.childNodes;for(var i = childs.length - 1; i >= 0; i--) {usernameEle.removeChild(childs[i]);}var usern...

weixin_36455562的博客 427

《网络安全自学教程》- OSI七层模型分层及作用,数据封装与解封过程,数据传输过程。

OSI分哪七层,每层的作用是什么,解释数据在七层模型中是怎样传输的,封包和解封过程,数据包在每一层是怎么封装和解封的。

wangyuxiang946的博客 1万+

uniapp - 微信小程序接入官方人脸识别认证详细流程及示例源码,Uniapp微信小程序项目集成官方提供的人脸识别身份验证插件接口(多种示例:人脸核验、身份证件与人脸是否匹配、是否活体、实名认证等)

uni-app微信小程序人脸识别认证,使用uniapp开发微信小程序的人脸采集功能/人脸识别功能,uniapp vue3微信小程序活体人脸识别,Uni-app微信小程序实名认证,uniApp微信小程序人脸认证,UniApp的微信小程序实名认证与人脸识别系统开发,人脸核身微信小程序uni-app接入流程,wx.startFacialRecognitionVerify,uniapp开发微信小程序-人脸采集功能、微信人脸识别实名认证集成指南,识别失败,人脸识别接口怎么调用,前后端完整示例代码demo,人脸检测功能

🏆 前端领域优质创作者 3285

Java递归遍历该节点下所有子节点

java递归树 需求 最近在做一棵资料树时,遇到业务需求:父节点状态改变,则子节点状态要一致。 实现思路 首先获取该节点的id,随后利用递归遍历出所有子节点,再将这些子节点状态修改为父节点的状态 实现代码 业务部分 /** 用于存放子节点的集合 */ List<Long> sonIds = new ArrayList<>(); /** * 修改大纲关系 * * @param baseRough 大纲关系 * @return 结果

Python编程:从入门到实践 2192

【论文解读】Baidu Apollo EM Motion Planner

系统顶层是一种多车道策略,通过并行计算车道级别轨迹来处理车道变更场景;在车道轨迹生成器内部,迭代的解决基于Frenet坐标的路径和速度规划;针对路径和速度规划问题,提出了动态规划与基于样条的二次规划相结合的方法,构造了一个可扩展且易于调整的框架,同时处理交通规则、障碍物决策和平滑度问题。该规划器可扩展至高速公路和城市低速驾驶场景。高精地图模块提供了任何人都可以访问的高精地图。感知和定位模块提供了动态环境中必要的信息。运动规划模块考虑生成一条安全平滑的轨迹再交由汽车的控制模块去执行。

xiewf的博客 6095

oracle遍历查询所有子节点,三种实现方法实现数据表中遍历寻找子节点

首页 > 数据库 > MsSql > 遍历寻找子节点三种实现方法实现数据表中遍历寻找子节点2008-05-17 21:48:44 作者:数据表中遍历寻找子节点的三种实现方法:示例问题如下:表结构:IdParentId102132......针对该表结构解释如下:1的父节点为0,2的父节点为1,3的父节点为2......以此类推,要求给定一个父节点的值,比如1,用SQL语句...

weixin_33201531的博客 746

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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

数据表中遍历寻找子节点的三种实现方法:  示例问题如下:   表结构:      Id ParentId    1 0    2 1    3 2    ......      针对该表结构解释如下:   1的父节点为0,   2的父节点为1,   3的父节点为2   ......   以此类推,要求给定一个父节点的值,比如1,   用SQL

爱喝浓咖啡 929

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

oracle递归遍历子节点父节点

原创不易,请移步原创作者博客查看原文:https://blog.youkuaiyun.com/bondchenj/article/details/78581625 一、适用情况: 适用树状结构数据,例如包含id,parent_id字段的数据表 ,表中数据可以通过某些字段找到其中的父子关系。 二、语法: select * from 表名 start with 条件1 connnect by...

时光有伱,记忆成花~ 4455

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ORACLE递归_ 树形遍历查询根节点、父节点、子节点_001

ORACLE递归_ 树形遍历查询根节点、父节点、子节点_001 一、适用情况: 适用树状结构数据,例如包含id,parent_id字段的数据表 ,表中数据可以通过某些字段找到其中的父子关系。 二、语法: select * from 表名 start with 条件1 connnect by 条件2 where 条件3 1、举例: (1)通过父ID查询所有子节点 select ...

lwh_zfj的博客 6741

c id遍历显示MySQL数据表内容_mysql 实现树形的遍历分析

前言:关于多级别菜单栏或者权限系统中部门上下级的树形遍历,oracle中有connect by来实现,mysql没有这样的便捷途径,所以MySQL遍历数据表是我们经常会遇到的头痛问题,下面通过存储过程来实现。1、建立测试表和数据:DROP TABLE IF EXISTStest.channel;CREATE TABLEtest.channel (idINT(11) NOT NULLAUTO_INC...

weixin_42108778的博客 253

MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...

背景说明 需求:MySQL树形结构, 根据指定的节点,获取其下属的所有子节点(包含路径上的枝干节点和叶子节点) 枝干节点:如果一个节点下还有子节点,则为枝干节点。 叶子节点:如果一个节点下不再有子节点,则为叶子节点。 问题分析 1、可以使用类似Java这种面向对象的语言,对节点集合进行逻辑处理,获取所有子节点。 2、直接自定义MySQL函数getChildList,通过一层wh...

weixin_30371469的博客 969

java中遍历树形菜单,你可能不知道还有这样的方法

版权声明:本文为优快云博主「穆雄雄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.youkuaiyun.com/qq_341...

穆雄雄的博客 487

mysql 递归遍历所以子节点

mysql 递归遍历所以子节点 对应的建表语句 DROP TABLE IF EXISTS yun_portal_account_web; CREATE TABLE yun_portal_account_web ( id int(0) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT ‘自增ID,接口接入账号id’, customerid int(0) UNSIGNED NOT NULL DEFAULT 0 COMMENT ‘所属客户,客户表的ID’, partnerid i

qq_39332031的博客 307

SQL语句遍历树结构的数据表

[转自]:肆尾葱的博客《SQL语句遍历树结构的数据表》 一、创建树结构的数据库表 -- 数据库为 SQL Server create table treeTest( id int, parentId int, info varchar(10) ) -- 插入数据 insert into treeTest(id,parentId,info) values(1,nul...

皓月如我的专栏 4083

php 获取子节点,php递归获取子节点

2. 用非递归算法遍历 设计思想:主要是通过栈的存取,判空,从而实现树的遍历 前序遍历:通过一个循环实现。先输出节点的数值,因为栈的特性,则需要先判断右子树......递归算法: 1.先序遍历:先序遍历就是首先判断根结点是否为空,为空则停止遍历,不为空则将左子 作为新的根结点重新进行上述判断, 左子遍历结束后, 再将右子......进行 递归,也就是把自己的 id 作为 f_id 参数把自己的子类...

weixin_30846347的博客 720

SQL SERVER 2000 遍历父子关系数据的表(二叉树)获得所有子节点 所有父节点及节点层数函数

---SQL SERVER 2000 遍历父子关系數據表(二叉树)获得所有子节点 所有父节点及节点层数函数 ---Geovin Du 涂聚文 --建立測試環境 Create Table GeovinDu ([ID] Int, fatherID Int, [Name

Geovin Du Dream Park 2872

oracle遍历数据表,Oracle数据库遍历树形结构表

1、从根结点开始找子节点/*create table test (id int ,pid int ,name varchar(10));insert into test values ( 1, 0 ,'n1' );insert into test values( 2, 1 ,'n12');insert into test values( 3, 1 ,'n13');insert into te...

weixin_39780260的博客 274
上一篇: 存储过程:利剑还是钝刀?
下一篇: 【转】是什么限制了我们面向对象(的开发)
SysBug
博客等级 码龄22年 3粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值