/*--按父找子--*/
declare @a table (TC_Id int,TC_PID int,TC_Name varchar(200))
insert @a values(1,0,'中国')
insert @a values(2,0,'美国')
insert @a values(3,0,'加拿大')
insert @a values(4,1,'北京')
insert @a values(5,1,'上海')
insert @a values(6,1,'江苏')
insert @a values(7,6,'苏州')
insert @a values(8,7,'常熟')
insert @a values(9,6,'南京')
insert @a values(10,6,'无锡')
insert @a values(11,2,'纽约')
insert @a values(12,2,'旧金山')declare @tmp1 table (TC_Id int,TC_PID int,TC_Name varchar(200),lev int)
insert @tmp1 select *,1 from @a where tc_ID=1
while @@rowcount>0
  insert @tmp1 select a.*,1 from  @a a,@tmp1 b where a.tc_pid=b.tc_ID and a.tc_ID not in (select tc_ID from @tmp1)
select * from @tmp1

解决方案 »

  1.   

    /*--遍厉所有--*/
    declare @你的表 table (sortid int,parid int,sortname varchar(20))
    insert @你的表 values(28,0,'包装')
    insert @你的表 values(63,0,'安全防护')
    insert @你的表 values(64,0,'办公')
    insert @你的表 values(73,0,'电脑')
    insert @你的表 values(74,63,'锁具')
    insert @你的表 values(75,63,'防盗门')
    insert @你的表 values(118,75,'普通防盗门')
    insert @你的表 values(119,75,'豪华防盗门')
    insert @你的表 values(120,28,'文化用纸')
    insert @你的表 values(121,28,'包装用纸')
    insert @你的表 values(122,28,'纸浆')
    insert @你的表 values(123,63,'保险柜')
    insert @你的表 values(124,63,'防身用具')
    insert @你的表 values(125,73,'主机 ')
    insert @你的表 values(126,73,'机箱')
    insert @你的表 values(127,73,'软件')
    insert @你的表 values(128,127,'财务软件')
    insert @你的表 values(129,127,'系统管理软件')
    insert @你的表 values(130,127,'工具软件软件')
    insert @你的表 values(131,127,'数据库软件')
    declare @tmp1 table (sortid int,parid int,sortname varchar(20),层次 int,所属分组 int)
    declare @i int,@j int
    select @i=1,@j=1while exists(select 1 from @你的表 where parid=0 and sortid not in (select sortid from @tmp1))
    begin
      insert @tmp1 select top 1 *,@i,@j from @你的表 where parid=0 and sortid not in (select sortid from @tmp1) order by sortid
      while @@rowcount>0
      begin
        set @i=@i+1
        insert @tmp1 select a.*,@i,@j from  @你的表 a,@tmp1 b where a.parid=b.sortid and a.sortid not in (select sortid from @tmp1)
      end
      select @j=@j+1,@i=1
    end
    select * from @tmp1
      

  2.   

    declare @a table ([EmployeeId] [char] (13)  NOT NULL ,
    [Name] [varchar] (50) NULL ,
    [ParentId] [char] (13),
             [grade] int)--级别declare @i int,@EmployeeId int
    set @EmployeeId=0 ----
    set @i=1
    insert @a select *,@i from S_Employee 
    where ParentId=@EmployeeIdwhile @i<6
    begin
    insert @a select A.EmployeeId,A.Name,A.ParentId,@i+1
    from S_Employee A,@a B 
    where A.ParentId=B.EmployeeId and B.grade=@i
    set @i=@i+1
    endselect * from @a where grade=6
      

  3.   

    --首先创建这样的自定义函数
    create function f_getbmmerg()
    returns @re table(id char(13),idmerg varchar(8000),level int)
    as 
    begin
    declare @level int
    set @level=1
    insert into @re select Employeeid,Employeeid,@level
    from S_Employee where parentid=0
    while @@rowcount>0
    begin
    set @level=@level+1
    insert into @re select b.Employeeid,a.idmerg+','+b.Employeeid,@level
    from @re a inner join S_Employee b on a.employeeid=b.parentid
    where a.level=@level-1 end
    return
    end
    go
      

  4.   

    --然后调用上面的自定义函数得到你要的结果:declare @EmployeeId char(13)
    set @EmployeeId='11'select * from S_Employee a inner join dbo.f_getbmmerg() b on a.EmployeeId=b.id
    where ','+b.idmerg+',' like '%,'+@EmployeeId+',%' and  b.level=6  --第6级
      

  5.   

    更多的方面参考我的贴子:树形数据处理
    http://expert.csdn.net/Expert/topic/2285/2285830.xml?temp=.0333063