给定一下三个表
        表a-职务表   字段 id  parentid  职务编号  职务全称
        表b-用户表   字段 id  用户编号  用户全称
        表c-用户职务表 字段  用户编号 职务编号 
要求写一条sql语句生成一个结果集,次结果集要求如下
(1)有如下几列  id parentid 编号 全称
 (2) 及国际记录了所有的项(职务和用户)及他们的父子关系,其中每一列是一个职务或者一个用户的信息
(3)若一项为叶子节点,则id可以为空,否则为原在表的id求解惑,求老师

解决方案 »

  1.   

    sorry 打错字 (2)结果集
      

  2.   

    其实只有1个问题,写一条sql语生成一个结果集
      

  3.   

    http://blog.csdn.net/jacky4955/article/details/6058620看看 这个是不是你想要的
      

  4.   

    这个题目问的不清楚 
    求的结果是什么的名字和全称 
    你可以先把表结构弄出来的嘛 
    比如L:
    tb_duty(id int,parentid int, dt_id int,dt_name varchar(64))
    tb_users(id int,user_id int,user_name varchar(64))
    duty_users(user_id int,dt_id int)
      

  5.   

    [Quote=引用 14 楼 lxpbs8851 的回复:]
    这个题目问的不清楚 
    求的结果是什么的名字和全称 
    你可以先把表结构弄出来的嘛 
    比如L:
    tb_duty(id int,parentid int, dt_id int,dt_name varchar(64))
    tb_users(id int,user_id int,user_name varchar(64))
    duty_users(user_id int,dt_id int)
    [/Q
    表结构很清楚啊,有如下几列 id parentid 编号 全称,就这4列啊
      

  6.   

    1 在sqlserver2005中,可以用一个sql语句得到结果集的(我做过,但sql代码在以前的资料,不去找),2 在sqlserver2000中,好像不能用一个sql语句做到,不太支持要递归算法。3 职务表可以改为如下,无parent字段的表,就设置更简单了:
    ID Code name,就是可以。
    Code的值用下面的逻辑编辑。
    001     局长
    001.001 处长3 另外还一个更宽泛的树形结构,如分别按照:
     职务
        年龄
          人员
    来查询。
      

  7.   

    还有你提问过于简单,
    要列出表结构,原始数据,还有期望的结果集,
    这样才会有人给你sql语句。
      

  8.   

    ---------------
    sorry,不明白你说的是啥
      

  9.   

    楼主,你刚毕业不久吧。
    我告诉你网站的提问的正确方法,
    这样你不用问了两天还没人理你。还有你提问过于简单,要列出表结构,原始数据,还有期望的结果集,这样才会有人给你sql语句。
      

  10.   


    楼主你有点浮躁啊,有点不虚心啊,那你出这个题给大家,是想简单得到答案,好去应付一下面试官。还是想通过向大家请教,学习到这种递归算法的sql写法。
      

  11.   

    这样?(愚见..)create table #职务表
    (id int,parentid int,职务编号 int,职务全称 nvarchar(50))
    insert #职务表
    select 1,null,11,'董事长' union all
    select 2,1,12,'经理' union all
    select 3,2,13,'主管' union all
    select 4,3,14,'员工'create table #用户表
    (id int,用户编号 int,用户全称 nvarchar(50))
    insert #用户表
    select 1,21,'大爷' union all
    select 2,22,'大哥A' union all
    select 3,23,'大哥B' union all
    select 4,24,'小哥A' union all
    select 5,25,'小哥B' union all
    select 6,26,'小哥C' union all
    select 7,27,'小弟A' union all
    select 8,28,'小弟B' union all
    select 9,29,'小弟C' union all
    select 10,30,'小弟D' create table #用户职务表
    (用户编号 int,职务编号 int)
    insert #用户职务表
    select 21,11 union all
    select 22,12 union all
    select 23,12 union all
    select 24,13 union all
    select 25,13 union all
    select 26,13 union all
    select 27,14 union all
    select 28,14 union all
    select 29,14 union all
    select 30,14 select (case when z3.id is null then '' else ltrim(u.id) end) id,
    uz.用户编号,u.用户全称,uz.职务编号,z.职务全称,
    z2.职务编号 as 领导职称编号 ,z2.职务全称 as 领导职称 
    from #用户表 as u 
    join #用户职务表 as uz on u.用户编号=uz.用户编号
    join #职务表 as z on uz.职务编号=z.职务编号
    Left join #职务表 z2 on z.parentid=z2.id
    Left join #职务表 z3 on z.id=z3.parentid--id           用户编号    用户全称         职务编号    职务全称         领导职称编号     领导职称
    -------------- ----------- ---------------- ----------- ---------------- ---------------- ---------
    --1            21          大爷             11          董事长           NULL NULL
    --2            22          大哥A            12          经理             11 董事长
    --3            23          大哥B            12          经理             11 董事长
    --4            24          小哥A            13          主管             12 经理
    --5            25          小哥B            13          主管             12 经理
    --6            26          小哥C            13          主管             12 经理
    --             27          小弟A            14          员工             13 主管
    --             28          小弟B            14          员工             13 主管
    --             29          小弟C            14          员工             13 主管
    --             30          小弟D            14          员工             13 主管
      

  12.   

    ---------------------
    你好聪明,思路很清晰,我头都搞晕了,有2个问题
    1.case when z3.id   是不是应该是z3.parentid
    2.Left join #职务表 z2 on z.parentid=z2.id
    Left join #职务表 z3 on z.id=z3.parentid  看不懂搞晕了,能不能解释下
      

  13.   

    愚见..select (case when z3.id is null then '' else ltrim(u.id) end) id,
    uz.用户编号,u.用户全称,uz.职务编号,z.职务全称,
    z2.职务编号 as 领导职称编号 ,z2.职务全称 as 领导职称 
    from #用户表 as u 
    join #用户职务表 as uz on u.用户编号=uz.用户编号
    join #职务表 as z on uz.职务编号=z.职务编号
    Left join #职务表 z2 on z.parentid=z2.id
    Left join #职务表 z3 on z.id=z3.parentid--"Left join #职务表 z2 on z.parentid=z2.id" 这句
    --是为了 " z2.职务编号 as 领导职称编号 ,z2.职务全称 as 领导职称 "这两列而写的..
    --注意" z.parentid=z2.id ",z跟z2的内容都是#职务表的内容(但你要把它们想像成两个表,只是内容相同),这种叫自连接,
    --" z.parentid=z2.id " 连接条件是z的parentid等于z2的id..z中的parentid是自己的领导的职称编号吧..
    --以这条数据为例( id=2 , parentid=1 , 职务编号=12 ,职务全称='经理' )
    -- 因为parentid=1,跟据 z.parentid=z2.id 到z2中找对应的 id,就找到'董事长'了..
    --看看这句的结果..select z.*,z2.职务编号 as 领导职称编号 ,z2.职务全称 as 领导职称 
    from #职务表 as z 
    Left join #职务表 z2 on z.parentid=z2.id--id          parentid    职务编号    职务全称         领导职称编号      领导职称
    ------------- ----------- ----------- ---------------- ----------------- -----------
    --1           NULL        11          董事长           NULL             NULL
    --2           1           12          经理             11               董事长
    --3           2           13          主管             12               经理
    --4           3           14          员工             13               主管
    --" Left join #职务表 z3 on z.id=z3.parentid "这句
    -- 是为了 " (case when z3.id is null then '' else ltrim(u.id) end) id "这列而写的..
    -- 注意" z.id=z3.parentid ",也是自连接,
    -- 连接条件是z的id等于z3的parentid..z从z3中找自己的下属..
    -- 以这条数据为例( id=4 , parentid=3 , 职务编号=14 ,职务全称='员工' )
    -- 因为id=4,跟据 z.id=z3.parentid 到z3中找对应的 parentid,z3中没有一条数据的parentid为4的,所以什么也找不到
    -- 看看这句的结果..select (case when z3.id is null then '' else ltrim(z.id) end) zid,
    z.*,z3.*
    from #职务表 as z 
    Left join #职务表 as z3 on z.id=z3.parentidzid    id  parentid    职务编号    职务全称    --   id          parentid    职务编号    职务全称
    ------- --- ----------- ----------- -------------------------------------------------- -----------
    1     1   NULL        11          董事长       --  2           1           12          经理
    2     2   1           12          经理         --  3           2           13          主管
    3     3   2           13          主管         --  4           3           14          员工
          4   3           14          员工         --  NULL        NULL        NULL        NULL--注意看结果右边部分('--'的右边),第4行是null的..
    --所以在判断zid这一列是取id还是null的时候, 用"z3.id is null" 或 "z3.parentid is null" 是一样的..