我的表包含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的经理。
答案 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