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

SQL查询以查找特定下属的所有上级,sql,sql-server-2005,recursion,common-table-expression,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

我的表包含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的管理者。这将生成树,在你的例子中,给出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

以下是完整的示例:

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 

您需要设置一个递归CTE来遍历层次结构树。例如,请看一看,

谢谢您的回复,但它没有显示6为什么3是因为2是4的上级,3也应该是6,因为3是4的上级6@MathewPaul-正如我的回答所述,我理解为什么我的代码不显示3和6。因此,我接着询问其他场景,以便在向下分支时更准确地阐述您的业务规则。目前,您的描述似乎要求“返回树中的每个节点”(向上爬每个分支,也向下爬每个分支=>到达每个节点?或者是否存在终止条件?)感谢您的解释我认为我的部分有错误是预期结果为5,4,2,1