SQL Query查找特定下属的所有上级

时间:2011-12-15 11:13:06

标签: sql sql-server-2005 recursion common-table-expression

我的表包含3列

Emp_ID |  Emp_Name   |  Emp_Manager_ID
========================================
1      |  Admin      |   Null         
2      |  John       |   1            
3      |  Sam        |   2             
4      |  Mike       |   2            
5      |  Jeff       |   4            
6      |  Ben        |   3            
7      |  Vicky      |   5

参数id @Emp_ID = 7找到给定Emp_Id下所有上级的预期结果,因此结果应该是所有EmpIDs 6,5,4,3,2,1因为5是7和4的管理者是5和2的经理是4,3的经理,3是6的经理,1是2的经理。

3 个答案:

答案 0 :(得分:3)

这会在树上运行,在你的情况下会给出7 - > 5 - > 4 - > 2 - > 1然后停止。

WITH
  unrolled_branch AS
(
  SELECT
    emp_id,
    emp_name,
    emp_mnager_id
  FROM
    yourTable
  WHERE
    emp_id = @emp_id

  UNION ALL

  SELECT
    your_table.emp_id,
    your_table.emp_name,
    your_table.emp_mnager_id
  FROM
    yourTable
  INNER JOIN
    unrolled_branch
      ON unrolled_branch.emp_manager_id = yourTable.emp_id
)
SELECT
  *
FROM
  unrolled_branch


我仍然坚持你如何获得3和6。你只是说他们和其他人的水平相同吗?

你有这棵树......

1-2-3-6
   \
    4-5-7

但结果应该在这棵树上怎么样?

      A-B-C
     /
1-2-3-6
   \
    4-5-7

您是否强制执行任何一个节点可能只有一个父节点的约束,并且任何树中的一个节点都必须没有父节点?或者这些都可以吗?

    3   9     5-6     7       C     C
   / \ /         \   /       / \   / \
1-2   6-8         3-4       A   D-A   D- (etc, etc)
   \ /           /   \       \ /   \ /
    4-5-7     1-2     8       B     B

答案 1 :(得分:0)

以下是完整示例:

create table #employees (
Emp_ID int,
Emp_Name varchar(10),
Emp_Manager_ID int
)


create table #superiors (
Emp_ID int
)

insert into #employees values (1, 'Admin', NULL)
insert into #employees values (2, 'John', 1)
insert into #employees values (3, 'Sam', 2)
insert into #employees values (4, 'Mike', 2)
insert into #employees values (5, 'Jeff', 4)
insert into #employees values (6, 'Ben', 3)
insert into #employees values (7, 'Vicky', 5)

declare @count int, @testID int
select @testID = 7

select @count = NULL
select @count = Emp_Manager_ID from #employees where Emp_ID = @testID

while(@count IS NOT NULL)
begin
  insert into #superiors values (@count)
  select @count = Emp_Manager_ID from #employees where Emp_ID = @count
end



select * from #superiors


drop table #employees
drop table #superiors 

答案 2 :(得分:0)

您需要设置递归CTE来遍历层次结构树。例如,请查看http://www.4guysfromrolla.com/webtech/071906-1.shtml