编号   推荐编号   职级
  001               01
  002               01
  003     001       02 
  004     003       02
  005     004       03
  006     005       03
  007     006       04
  008     007       04
  009     008       05
  010     002       02
  011     010       02
  012     011       02    得到如下结果
   编号         职级关系
   009          001,004,005,008,009,
   012          002,012
   001          001,
   002          002,
   003          001,003,
   ……
   表中如果编号与推荐编号同职级则按推荐编号的上一级编号查找
   如012 的推荐编号为011但职级都为02则,以次,012的职级关系为002,012
   弄了好几天还是查不到正确的结果 ,请大家帮忙看看~~~

解决方案 »

  1.   

    ALTER   function f_getmergid(@id varchar(8000))
      returns varchar(8000)
      as
      begin
        declare @re varchar(8000),@pid varchar(8000)    --为了数字排序正常,需要统一编码宽度
        declare @idlen int,@idheader varchar(20)
        select @idlen=max(len(编号))
         ,@idheader=space(@idlen)
         from vperson2    --得到编码累计
        set @re=right(@idheader+@id,@idlen)
        select @pid=推荐人编号 from vperson2 where 编号=@id
        while @@rowcount>0
        set @re=@re+@@rowcount
        select @re=right(@idheader+@pid,@idlen)+@re
         ,@pid=推荐人编号 from vperson2 where 编号=@pid 
        return(@re)
      end
    我用的是这个函数,但是职级的限制条件我不知道应该加在哪?
      

  2.   

    给你一个例子 ,是关于这方面的
    /*
    用递归处理树型结构(表结构)
    递归求城市,从小到大的,或从大到小。
    */
    /*
    等依次类推得目录树结构
    我想写一个函数 传入部门ID号后 马上得到相应的 部门结构 如
    输入8得到的是市场部-东南市场-上海市
    输入9得到的是市场部-西北市场-北京市
    输入6得到的是市场部-西北市场输入3得到的是市场部输入1得到的是所有部门
    */
    --建立测试环境
    create table TableA(deptID int,deptName nvarchar(100),parentID int)
    insert into TableA
    select 1,'所有部门',0 union all
    select 2,'财务部', 1 union all
    select 3,'市场部', 1 union all
    select 4,'仓库管理',1 union all
    select 5,'东北市场',3 union all
    select 6,'西北市场',3 union all
    select 7,'东南市场',3 union all
    select 8,'上海市', 7 union all
    select 9,'北京市', 6--建立函数
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[AllDept]') and xtype in (N'FN', N'IF', N'TF'))
    drop function [dbo].[AllDept]
    GOCREATE function AllDept(@iDeptID int)
    returns nvarchar(1000)
    as
    begin
    declare @vReturnValue nvarchar(1000)
    ,@iParentID int
    ,@vCurrentDeptName nvarchar(200)
    select @vReturnValue=''
    ,@vCurrentDeptName=''
    if(exists(select top 1 0 from TableA where DeptID=@iDeptID and parentID=0))
    begin
    select @vReturnValue =@vReturnValue+deptName+'-'
    from TableA
    where parentID<>0
    return (@vReturnValue)
    end
    if(exists(select top 1 0 from TableA where DeptID=@iDeptID and parentID=1))
    begin
    select @vReturnValue=@vReturnValue+deptName 
    from TableA where DeptID=@iDeptID and parentID=1
    --return (@vReturnValue)
    --set @vReturnValue=@vReturnValue+dbo.AllDept(@iParentID)
    end
    else
    begin
    select @iParentID=parentID 
    ,@vCurrentDeptName=deptName
    from TableA 
    where DeptID=@iDeptID
    set @vReturnValue=@vReturnValue+@vCurrentDeptName+'-'+dbo.AllDept(@iParentID)
    --return (@vReturnValue)
    end
    return (@vReturnValue)
    endGO
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GOselect *,dbo.AllDept(deptid) AllDeptName from tableAselect * from tableA
    --显示结果
    deptId deptName AllDeptName
    1 所有部门 0 财务部-市场部-仓库管理-东北市场-西北市场-东南市场-上海市-北京市-
    2 财务部 1 财务部
    3 市场部 1 市场部
    4 仓库管理 1 仓库管理
    5 东北市场 3 东北市场-市场部
    6 西北市场 3 西北市场-市场部
    7 东南市场 3 东南市场-市场部
    8 上海市 7 上海市-东南市场-市场部
    9 北京市 6 北京市-西北市场-市场部
    --删除测试环境
    drop table tableA
    drop table dbo.AllDept
      

  3.   

    create table A
    (
       编号 varchar(5),   
       推荐编号 varchar(5),   
       职级 varchar(5)
    )insert A select '001',' ','01'
    insert A select '002',' ','01'
    insert A select '003','001','02'
    insert A select '004','003','02'
    insert A select '005','004','03'
    insert A select '006','005','03'
    insert A select '007','006','04'
    insert A select '008','007','04'
    insert A select '009','008','05'
    insert A select '010','002','02'
    insert A select '011','010','02'
    insert A select '012','011','02'create Function leva(@id varchar(10))
    returns varchar(1000)
    as 
    begin
    declare @T_SQL varchar(1000)
    set @T_SQL=''
    declare @T table(编号 varchar(5),推荐编号 varchar(5),职级 varchar(5),leva int)
    declare @leva int
    set @leva=1
    insert @T select 编号,推荐编号,职级,@leva from A where 编号=@id
    while @@rowcount>0 
    begin
       set @leva=@leva+1
       insert @T select T1.编号,T1.推荐编号,T1.职级,@leva from A T1,(select * from @T where leva=@leva-1) T2 where T1.编号=T2.推荐编号
    end
    select @T_SQL=@T_SQL + T.推荐编号 +',' from (select min(推荐编号) as 推荐编号,职级  from @T  where  推荐编号<>'' group by 职级)T
    set @T_SQL= @T_SQL+ @id
    return @T_SQL
    endselect 编号,Dbo.leva(编号) from A