呵呵 ,对于高手应该不简单的拉,最近项目遇到个这样的树型结构的查询 ,特来请教高手业务背景描述:有会员管理系统中:会员是成树状的结构,就有 一个会员下面有0个到n个会员,会员是分层次的一层一层往下增加,比如: 会员1 下有会员2,会员3,会员4……会员n  ,会员2 下又哟会员5,会员6,……会员n ;会员3下又有会员7,会员8……会员n; 会员5下又有会员9,会员10,……会员N ;      设计表结构如下user( 会员ID,上级会员ID ,上上级会员ID),增加会员的时候要求必须输入上级会员ID ,上上级会员ID(两中关系的会员利润不一样,这里先不考虑这个)。   问题1:要求根据任何一个会员的会员id 查询出该会员下面的所有会员,要求体  现出会员之间的结构层次。
    
   问题2:要求根据新增加的会员ID查询出他上面的所有会员.
    
   说了这么多如果高手还有不明白的可以随时问,在先等待。

解决方案 »

  1.   

    create proc sp_xjcx
      --下级查询
       @hybh int
    as
    create table #xjcx (
       hybh int,   --会员编号
       sjbh int,   --上级会员编号
       jb int      --级别)declare @jb int
    select @jb=0
    --先把会员本身的记录添加进去
    insert into #xjcx select hybh,sjbh,@jb from user where hybh=@hybh
    while @@rowcount>0
    begin
        select @jb=@jb+1
        insert into #xjcx select hybh,sjbh,@jb from user where sjbh in (select hybh from #xjcx where jb=@jb-1)
    end
    select * from #xjcx
    go--就这样就行了,查询上级的编号和这个类似,我就不再写了.
      

  2.   

    忘了一项,在GO前面再加一句drop table #xjcx,把临时表给删掉.
      

  3.   

    --先写一个函数,用来获得当前用户的parent 字符串
    create function dbo.GetLevel(@id as int,@id1 as int) 
    returns varchar(500) as 
    begindeclare @parent int
    declare @i varchar(500)
    set @i=cast(@id1 as varchar)
    set @parent=@id1
    while @parent<>@id and @parent is not null
    begin
    select @parent=parent from table where id=@parent
    set @i=@i + cast(@parent as varchar)
    end
    if @parent=@id 
    return @i
    else
    return '*'end--然后写一个查询
    select space(len(dbo.getlevel(id,@id))) + cast(id as varchar)
    from table
    where dbo.getLevel(id,@id)<>'*'
    order by dob.getlevel(id,@id)
      

  4.   

    set @i=@i + cast(@parent as varchar)这一句似乎写反了,应该是
    set @i=cast(@parent as varchar)+ @i
      

  5.   

    --查询应该这样写,呵呵
    select space(len(dbo.getlevel(@id,id))) + cast(id as varchar)
    from table
    where dbo.getLevel(@id,id)<>'*'
    order by dob.getlevel(@id,id)