SQL查询以查找特定下属的所有上级
我的表包含3列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
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