Sql Oracle与递归连接
我有一张员工表和一张部门表 我想写一个查询,如果其dep_id的status列有“a”,则列出员工id 例如: 对于employee_id=1,我应该看到1,因为它的父dept_id(10)的status='A'Sql Oracle与递归连接,sql,oracle,recursion,join,Sql,Oracle,Recursion,Join,我有一张员工表和一张部门表 我想写一个查询,如果其dep_id的status列有“a”,则列出员工id 例如: 对于employee_id=1,我应该看到1,因为它的父dept_id(10)的status='A' Department Table employee_id | dept_id | status |level 1 |10 | null | 1 2 |20 | null | 1 10
Department Table
employee_id | dept_id | status |level
1 |10 | null | 1
2 |20 | null | 1
10 |100 | A | 2
20 |200 | null | 2
100 |1000 | null | 3
200 |2000 | A | 3
450 |750 | null | 1
5 |30 | null | 1
30 |300 | null | 2
3 |400 | A | 1
400 |4000 | null | 2
Employee Table
employee_id | employee_name
1 | steven
2 | jone
3 | eric
4 | mark
5 | harry
对于employee_id=2,我应该看到2,因为它的父dept_id(200)的status='A'
Department Table
employee_id | dept_id | status |level
1 |10 | null | 1
2 |20 | null | 1
10 |100 | A | 2
20 |200 | null | 2
100 |1000 | null | 3
200 |2000 | A | 3
450 |750 | null | 1
5 |30 | null | 1
30 |300 | null | 2
3 |400 | A | 1
400 |4000 | null | 2
Employee Table
employee_id | employee_name
1 | steven
2 | jone
3 | eric
4 | mark
5 | harry
对于employee_id=5,我不应该是5,因为它的父母没有status='A'
Department Table
employee_id | dept_id | status |level
1 |10 | null | 1
2 |20 | null | 1
10 |100 | A | 2
20 |200 | null | 2
100 |1000 | null | 3
200 |2000 | A | 3
450 |750 | null | 1
5 |30 | null | 1
30 |300 | null | 2
3 |400 | A | 1
400 |4000 | null | 2
Employee Table
employee_id | employee_name
1 | steven
2 | jone
3 | eric
4 | mark
5 | harry
上述两个表的示例结果为:
| employee_id|
1
2
我现在的问题是这样的:
SELECT Employee.employee_id FROM Department
JOIN Employee ON Employee.employee_id = Department.employee_id;
您需要以下层次结构查询:
SQL> -- SAMPLE DATA
SQL> WITH DEPT_EMP (employee_id , dept_id, status, lVL) as
2 (select 1 , 10 , null, 1 from dual union all
3 select 2 , 20 , null, 1 from dual union all
4 select 10 , 100 , 'A' , 2 from dual union all
5 select 20 , 200 , null, 2 from dual union all
6 select 100 , 1000, null, 3 from dual union all
7 select 200 , 2000, 'A' , 3 from dual union all
8 select 450 , 750 , null, 1 from dual union all
9 select 5 , 30 , null, 1 from dual union all
10 select 30 , 300 , null, 2 from dual union all
11 select 3 , 400 , 'A' , 1 from dual union all
12 select 400 , 4000, null, 2 from dual),
13 EMPS (employee_id, employee_name) AS
14 (SELECT 1, 'steven' FROM DUAL UNION ALL
15 SELECT 2, 'jone' FROM DUAL UNION ALL
16 SELECT 3, 'eric' FROM DUAL UNION ALL
17 SELECT 4, 'mark' FROM DUAL UNION ALL
18 SELECT 5, 'harry' FROM DUAL)
19 -- YOUR QUERY STARTS FROM HERE
20 SELECT D.EMPLOYEE_ID, E.EMPLOYEE_NAME
21 FROM (SELECT STATUS, LVL, CONNECT_BY_ROOT EMPLOYEE_ID AS EMPLOYEE_ID
22 FROM DEPT_EMP
23 CONNECT BY EMPLOYEE_id = PRIOR dept_id) D
24 JOIN EMPS E ON D.EMPLOYEE_ID = E.EMPLOYEE_ID
25 WHERE STATUS = 'A' AND LVL > 1;
EMPLOYEE_ID EMPLOY
----------- ------
1 steven
2 jone
SQL>
下面是一个演示:
好吧,这只是一个简单的附加
,其中Department.status='a'
它也给出了3,但是它的父部门不包含'a'。标准是父部门应该包含'a'。查询应该检查父部门。抱歉,没有实现部门id=employee\u id的递归连接,如@Tejash didHi@tom,你能给我解释一下这是一个好答案吗?当我删除条件:和LVL>1时,查询返回3个结果。在你的问题中没有提到级别列,它应该大于1?Tejash-你也有同样的问题。这是小提琴,你可以看到它返回3行:我的答案返回2行。谢谢干杯