表 
dept_id   super_dept_id   dept_name 
      1                   0                     中国公司 
      2                   1                     北京分公司 
      3                   1                     广东分公司 
      4                   2                     北京东城区分公司 
      5                   2                     北京海淀区分公司 
      6                   3                     广东广州分公司 
      7                   3                     广东深圳分公司 
--- 
形式如: 
中国公司 
      北京分公司 
            北京东城区分公司 
            北京海淀区分公司 
      广东分公司 
              广东广州分公司 
              广东深圳分公司 
表员工表: 
staff_id     dept_id(部门ID)   staff_name 
      1                           2                           小经 
      2                           4                           小强 
      3                           5                           小公 
如要取得北京分公司的员工,就可以得到北京分公司下属的员工.
无限级 

解决方案 »

  1.   

    --建立環境
    create table company (dept_id int,   super_dept_id int,   dept_name   varchar(20))
    insert into company
                   select             1,                   0,                     '中国公司'  
    union all select             2,                   1,                     '北京分公司'  
    union all select             3,                   1,                     '广东分公司'  
    union all select             4,                   2,                     '北京东城区分公司'  
    union all select             5,                   2,                     '北京海淀区分公司'  
    union all select             6,                   3,                    ' 广东广州分公司'  
    union all select             7,                   3,                     '广东深圳分公司'  ---建立函數create function fnGetChildren(@id int)
    returns @tmp table(dept_id int,dept_name varchar(20))
    as
    begin
        insert @tmp select dept_id,dept_name from company where  dept_id = @id
        while @@rowcount > 0
        insert @tmp select a.dept_id,a.dept_name from company as a INNER JOIN @tmp as b
        on a.super_dept_id = b.dept_id where a.dept_id not in(select dept_id  from @tmp)
    return
    end
     
    --測試:
     
    select   * from dbo.fnGetChildren(2)              
    /*
    結果:dept_id                    dept_name
    ----------------------------------------------------
    2 北京分公司
    4 北京东城区分公司
    5 北京海淀区分公司
    */
         
    --最後把結果和員工表連接,就可以了 
      

  2.   

    NEWusee 
    天天学习 
    等 级:
     发表于:2007-09-30 11:27:523楼 得分:0 
    可不可以不用OR呢 
    -------------------------------------------哪里有"or" 啊?是通过写一个函数,传入一各节点,返回该节点下的所有子节点。你哪里有不明白的!
      

  3.   

    写个存储过程吧
    create procedure pro_man(@id varchar(20)) --@id 为要查找公司对应的dept_id
    as
    select staff_name from 员工表 
    where dept_id in(select dept_id from 公司表 where super_dept_id =@id) or dept_id=@id
    g0exec pro_man '北京分公司的id‘