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

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

时间: 2024-09-20 19:44:23

三种实现方法实现数据表中遍历寻找子节点_MsSql的相关文章

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

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

Sql Server里删除数据表中重复记录的例子_MsSql

[项目] 数据库中users表,包含u_name,u_pwd两个字段,其中u_name存在重复项,现在要实现把重复的项删除! [分析] 1.生成一张临时表new_users,表结构与users表一样: 2.对users表按id做一个循环,每从users表中读出一个条记录,判断new_users中是否存在有相同的u_name,如果没有,则把它插入新表:如果已经有了相同的项,则忽略此条记录: 3.把users表改为其它的名称,把new_users表改名为users,实现我们的需要. [程序] 复制代

javascript确认框的三种使用方法

 javascript确认框的三种使用方法,在开发中经常要用到,记录一下使用方法 第一种方法:挺好用的,确认以后才能打开下载地址页面.原理也比较清晰.主要用于删除单条信息确认.  代码如下: <SCRIPT LANGUAGE=javascript>  function del() {    var msg = "您真的确定要删除吗?nn请确认!";    if (confirm(msg)==true){      return true;    }else{      re

Excel表格中汇总多个数据表中的数据的方法

  Excel表格中汇总多个数据表中的数据的方法           1.打开需要处理的工作簿,在这个工作簿中,"11月采购表"和"12月采购表"工作表包含需要合并的数据,如图1所示."合计"工作表用于放置进行合并计算后的数据,其结构如图2所示. 图1 需要合并的两张工作表 图2 "合计"工作表的结构 2.在"合计"工作表中单击选择放置合并计算结果的单元格区域中的第一个单元格,然后在功能区"数据&

js中判断对象是否为空的三种实现方法

 本篇文章主要是对js中判断对象是否为空的三种实现方法进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助 在写js脚本的时候经常遇到对象为空或者不是对象的情况,出现这种情况我们可以用if去判断它,然后去执行相应的处理方法,具体判断他们的方法有以下几种:   1.if   (typeOf(x)   ==   "undefined")   2.if   (typeOf(x)   !=   "object")   3.if(!x)   其中第三种是最简单的

MSSql简单查询出数据表中所有重复数据的方法_MsSql

本文实例讲述了MSSql简单查询出数据表中所有重复数据的方法.分享给大家供大家参考,具体如下: 这里直接给出下面的例子: SELECT * FROM SYS_LogContent slc WHERE slc.LogInfo_ID IN ( SELECT slc2.LogInfo_ID FROM SYS_LogContent slc2 GROUP BY slc2.LogInfo_ID HAVING COUNT(*)>1 ) 简单说明: 关键代码在于上面的括号中.要想查询出所有重复的数据,可以按照某

MSSql简单查询出数据表中所有重复数据的方法

本文实例讲述了MSSql简单查询出数据表中所有重复数据的方法.分享给大家供大家参考,具体如下: 这里直接给出下面的例子: SELECT * FROM SYS_LogContent slc WHERE slc.LogInfo_ID IN ( SELECT slc2.LogInfo_ID FROM SYS_LogContent slc2 GROUP BY slc2.LogInfo_ID HAVING COUNT(*)>1 ) 简单说明: 关键代码在于上面的括号中.要想查询出所有重复的数据,可以按照某

ajax 三种实现方法实例代码_IOS

ajax即异步的javascript and xml, 本文章向码农们介绍ajax的三种实现方法(prototype实现,jquery实现,XMLHttpRequest实现) 本文主要是比较三种实现Ajax的方式,为以后的学习开个头. 准备: 1.  prototype.js 2.  jquery1.3.2.min.js 3.  json2.js 后台处理程序(Servlet),访问路径servlet/testAjax: Java代码 package ajax.servlet; import j

Sql Server中清空所有数据表中的记录_MsSql

Sql Server中清空所有数据表中的记录 清空所有数据表中的记录: 复制代码 代码如下: exec sp_msforeachtable  @Command1 ='truncate table ?' 删除所有数据表: 复制代码 代码如下: exec sp_msforeachtable 'delete   N''?''' 清空SQL Server数据库中所有表数据的方法(有约束的情况) 其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之