Sql Oracle与递归连接

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

我有一张员工表和一张部门表

我想写一个查询,如果其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          |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行。谢谢干杯