2014-07-08 55 views
0

我正在使用oracle数据库与休眠。 我有一个EMPLOYEE表,在管理器上有一个自我链接。事情是这样的:SQL父级子级的第n级递归

create table employee(
id number(14) not null, 
username varchar(100) not null unique, 
manager number(14), 

constraint employee_pk primary key (id), 
constraint employee_manager_fk foreign key (manager) references employee (id) 
); 

目前,我可以选择一个员工及其直接孩子:

select e2.* 
from employee e2, 
(select e.* from employee e where e.username='abc') e1 
where e2.manager = e1.id 

union 

select e.* from employee e where e.username='abc' 

我想运行在那里给我可以选择的所有一个员工的用户名时,它的孩子的员工查询直到第n级。我如何在SQL语句中执行此操作?

+0

可能重复http://stackoverflow.com/questions/14274942/sql-server-cte-and-recursion-example ) – epoch

+0

嗯......它是相关的,但因为即使答案不同,我相信它不是重复的。 – JackDev

回答

3

这就是connect by是:

select * 
from employee 
where level <= 5 
connect by prior id = .manager 
start with username = 'abc' 

注意level开始从1在与start with标识的行计数。它不是树的“整体”层级。

在手册中的更多细节:
http://docs.oracle.com/cd/E11882_01/server.112/e41084/queries003.htm#SQLRF52332

[SQL SERVER CTE和递归示例](的
+0

更新了where子句,应该是在from之后。 – JackDev

+0

@JackDev谢谢,更正。 –

0
select e1.* 
from employee e2 
left outer join 
employee e1 on e1.id= e2.manager 
where e2.username='abc' 
union 
select e.* from employee e where e.username='abc' 
+1

这不是一个递归查询。 –