create table tb(id int,name varchar(50),parentid int)
insert into tb select 1,'安徽省',0
insert into tb select 2,'湖南省',0
insert into tb select 3,'合肥市',1
insert into tb select 4,'巢湖市',1
insert into tb select 5,'肥西县',3
insert into tb select 6,'肥东县',3
insert into tb select 7,'肥东乡',6
insert into tb select 8,'肥东村',7
insert into tb select 9,'湖南乡',2
insert into tb select 10,'湖南镇',9
gowith dom 
as
(select * from tb where parentid=3 
union all
select a.* from tb a inner join dom b on a.parentid=b.id)select * from dom递归,楼主照写下吧,实在写不下去了...

解决方案 »

  1.   


    /*
    标题:查询指定节点及其所有子节点的函数
    作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开) 
    时间:2008-05-12
    地点:广东深圳
    */create table tb(id varchar(3) , pid varchar(3) , name varchar(10))
    insert into tb values('001' , null  , '广东省')
    insert into tb values('002' , '001' , '广州市')
    insert into tb values('003' , '001' , '深圳市')
    insert into tb values('004' , '002' , '天河区')
    insert into tb values('005' , '003' , '罗湖区')
    insert into tb values('006' , '003' , '福田区')
    insert into tb values('007' , '003' , '宝安区')
    insert into tb values('008' , '007' , '西乡镇')
    insert into tb values('009' , '007' , '龙华镇')
    insert into tb values('010' , '007' , '松岗镇')
    go--查询指定节点及其所有子节点的函数
    create function f_cid(@ID varchar(3)) returns @t_level table(id varchar(3) , level int)
    as
    begin
      declare @level int
      set @level = 1
      insert into @t_level select @id , @level
      while @@ROWCOUNT > 0
      begin
        set @level = @level + 1
        insert into @t_level select a.id , @level
        from tb a , @t_Level b
        where a.pid = b.id and b.level = @level - 1
      end
      return
    end
    go--调用函数查询001(广东省)及其所有子节点
    select a.* from tb a , f_cid('001') b where a.id = b.id order by a.id
    /*
    id   pid  name       
    ---- ---- ---------- 
    001  NULL 广东省
    002  001  广州市
    003  001  深圳市
    004  002  天河区
    005  003  罗湖区
    006  003  福田区
    007  003  宝安区
    008  007  西乡镇
    009  007  龙华镇
    010  007  松岗镇(所影响的行数为 10 行)
    */--调用函数查询002(广州市)及其所有子节点
    select a.* from tb a , f_cid('002') b where a.id = b.id order by a.id
    /*
    id   pid  name       
    ---- ---- ---------- 
    002  001  广州市
    004  002  天河区(所影响的行数为 2 行)
    */--调用函数查询003(深圳市)及其所有子节点
    select a.* from tb a , f_cid('003') b where a.id = b.id order by a.id
    /*
    id   pid  name       
    ---- ---- ---------- 
    003  001  深圳市
    005  003  罗湖区
    006  003  福田区
    007  003  宝安区
    008  007  西乡镇
    009  007  龙华镇
    010  007  松岗镇(所影响的行数为 7 行)
    */drop table tb
    drop function f_cid
      

  2.   


    ;with tt
    AS
    (
    select id,pid from tb where id = @id
    union all
    select a.id,a.pid from tb b join tt b on a.pid = b.id
    )
    select * from tt
      

  3.   


    create table #1(id int,pid int,sname nvarchar(256))
    insert #1 values(1,0,'abc1')
    insert #1 values(2,1,'abc2')
    insert #1 values(3,1,'abc3')
    insert #1 values(4,3,'abc4')
    insert #1 values(5,3,'abc5')
    insert #1 values(6,5,'abc6')
    insert #1 values(7,6,'abc7')
    insert #1 values(8,2,'abc8')
    insert #1 values(9,8,'abc9')
    insert #1 values(10,4,'abc10')--查询id下所有的节点数
    ---sql 2005
    ;with tt
    as
    (
        select ID,pid from #1 where id = 3
        union all
        select a.ID,a.pid from #1 a join tt b on a.pid = b.id
    )
    select * from tt-----------sql2000declare @tt table(id int,pid int,sname nvarchar(256),lev int)
    declare @lev int
    set @lev = 0
    insert @tt select *,@lev from #1 where id = 3
    while @@rowcount > 0
    begin
    set @lev = @lev + 1
    insert @tt
    select a.*,@lev from #1 a join @tt b on a.pid = b.id and b.lev = @lev - 1
    end
    select id,pid,sname from @ttid          pid         sname
    ----------- ----------- ------------------
    3           1           abc3
    4           3           abc4
    5           3           abc5
    10          4           abc10
    6           5           abc6
    7           6           abc7
      

  4.   

    create table tb(ID int,   PID int)
    insert into tb values(10    , null)
    insert into tb values(101   , 10 )
    insert into tb values(1011  , 101 )
    insert into tb values(10111 , 1011 )
    insert into tb values(1012  , 101 )
    insert into tb values(102   , 10 )
    insert into tb values(10121 , 1012) 
    insert into tb values(1013  , 101 )
    insert into tb values(10122 , 1012 )
    insert into tb values(103   , 10 )
    go--查询指定节点及其所有子节点的函数
    create function f_cid(@ID int) returns @t_level table(id int , level int)
    as
    begin
      declare @level int
      set @level = 1
      insert into @t_level select @id , @level
      while @@ROWCOUNT > 0
      begin
        set @level = @level + 1
        insert into @t_level select a.id , @level
        from tb a , @t_Level b
        where a.pid = b.id and b.level = @level - 1
      end
      return
    end
    go--调用函数查询10及其所有子节点
    select a.* from tb a , f_cid(10) b where a.id = b.id order by a.id
    /*
    ID          PID         
    ----------- ----------- 
    10          NULL
    101         10
    102         10
    103         10
    1011        101
    1012        101
    1013        101
    10111       1011
    10121       1012
    10122       1012(所影响的行数为 10 行)
    */--调用函数查询101及其所有子节点
    select a.* from tb a , f_cid(101) b where a.id = b.id order by a.id
    /*
    ID          PID         
    ----------- ----------- 
    101         10
    1011        101
    1012        101
    1013        101
    10111       1011
    10121       1012
    10122       1012(所影响的行数为 7 行)
    */drop table tb
    drop function f_cid