手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网络编程>Mysql>列表

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

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

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

  示例问题如下:

  表结构:

  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

  实现方法三:

  代码如下:

以下是引用片段:
  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


文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!