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

ZDNet软件频道 时间:2009-12-03 作者: | 赛迪网 我要评论()
本文关键词:Server 服务器 SQL
............下面的Sql是在Sql Server下调试通过的,如果是Oracle,则有Connect By可以实现.( )( ) Drop Table #AllRow Set @Id = 3;Select DbTree.Id,DbTree.ParentId From RootNodeCTE

  示例问题如下:

  表结构:

  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

  实现方法二:

  代码如下:

  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

Server

服务器

SQL


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134