表Dept(用来存储部门结构信息,其中parantid字段的值是1代表没有父级部门了)
字段 deptd,parantid,deptname
      1     2         开发组
      2     3         北京开发部
      3     1         研发序列
       4     1         总经理办公室
      5     6         销售部
      6     1         营销序列 这个表中的数据代表:
  开发组-北京开发部-开发序列
  销售部-营销序列表user(用来存储用户信息)
字段  userid,deptid,username
        a     1       张三
        b     4       李四
        c     5       王五
        d     6       马六
用sql得到用户a的部门id是1:
        select deptid from user where userid='a' 
       
用sql得到用户a的父级部门id是2
       select parantid from dept where deptid=1
       
用sql得到用户a的父级的父级部门id是3
       select parantid from dept where deptid=2用sql得到parantid=1代表3就是用户a的顶级部门
       select parantid from dept where deptid=3
最终想得到所有用户所在部门的整个部门结构,例如:
用户名   部门结构
  张三    开发组-北京开发部-开发序列
  李四     总经理办公室
  王五     销售部-营销序列
  马六     营销序列  

解决方案 »

  1.   

    USE test
    GO-->生成表Deptif object_id('Dept') is not null 
    drop table Dept
    Go
    Create table Dept(deptd smallint,parantid smallint,deptname nvarchar(6))
    Insert into Dept
    Select 1,2,N'开发组'
    Union all Select 2,3,N'北京开发部'
    Union all Select 3,1,N'研发序列'
    Union all Select 4,1,N'总经理办公室'
    Union all Select 5,6,N'销售部'
    Union all Select 6,1,N'营销序列'
    -->生成表userif object_id('user') is not null 
    drop table [user]
    Go
    Create table [user]([userid] nvarchar(1),[deptid] smallint,[username] nvarchar(2))
    Insert into [user]
    Select N'a',1,N'张三'
    Union all Select N'b',4,N'李四'
    Union all Select N'c',5,N'王五'
    Union all Select N'd',6,N'马六'Go;WITH t AS (
    SELECT 
    deptd
    ,parantid
    ,CAST(deptname AS NVARCHAR(400)) AS deptname
    ,1 AS row
    FROM Dept
    WHERE parantid=1
    UNION ALL
    SELECT
    a.deptd
    ,a.parantid
    ,CAST(a.deptname+'-'+t.deptname AS NVARCHAR(400)) AS deptname
    ,row+1
    FROM Dept AS a
    INNER JOIN t ON a.parantid=t.deptd
    WHERE a.parantid<>1

    )SELECT 
    a.[username] AS [用户名]
    ,t.deptname AS [部门结构]
    FROM [user] AS a
    INNER JOIN t ON a.deptid=t.deptd
    ORDER BY a.userid

    /*
    用户名  部门结构
    ---- --------------------------------
    张三   开发组-北京开发部-研发序列
    李四   总经理办公室
    王五   销售部-营销序列
    马六   营销序列*/
      

  2.   

    楼上的with递归公用表达式是没有问题的。
      

  3.   

    到程序里面去递归吧,SQL里面的递归可能改起来会稍微费神一点