SQL 获取全部 children

SQL get all children

所以我有按部门组织的分层数据,每个部门都有一个 parent 部门,除了顶级部门。我现在想写一个SELECT语句到select这个层级结构,累加起来。这意味着对于层次结构中的每个级别,我都希望看到所有 children 的条目。

例如,如果我有以下表格: 部门

ID  PARENT_ID

1   null
2   1
3   1
4   2
5   2
6   3
7   3

员工

ID  DEPT
1   2
2   2
3   3
4   4
5   5
6   6
7   7
8   2
9   3
10  4
11  5
12  6
13  7
14  2
15  3
16  4
17  5

我想要类似下面的结果:

ID_E ROOT DEPT
1    null 1
1    1    2
2    null 1
2    1    2
3    null 1
3    1    3
4    null 1
4    1    2
4    2    4
5    null 1
...

我环顾四周并摆弄了一下,但就是无法正常工作。

我认为这可以解决问题,但它给出了奇怪的结果(意味着许多重复的行):

SELECT connect_by_root(dept.id) AS dept_id, 
       CONNECT_BY_ROOT(dept.parent_id) AS parent_id, 
       emp.id AS id_e
FROM emp
RIGHT JOIN dept ON emp.dept = dept.id
CONNECT BY PRIOR dept.id = dept.parent_id

编辑:Here is a fiddle of the scenario

我想出了一个解决方案,使用递归 CTE 来解析层次结构并检索部门可以连接到根的每种可能方式,然后将其与员工 table。

你能试一试吗,如果有效请告诉我?

WITH RCTE_DEPT(id,root,parent_id) AS(
  SELECT id,parent_id, id
  FROM dept
  UNION ALL
  SELECT dept.id,root,RCTE_DEPT.parent_id
  FROM dept
  JOIN RCTE_DEPT ON
    dept.parent_ID = RCTE_DEPT.id)
SELECT emp.id as ID_E, RCTE_DEPT.root as ROOT, RCTE_DEPT.parent_id as DEPT
FROM emp
JOIN RCTE_DEPT ON emp.DEPT = RCTE_DEPT.id 

ORDER BY ID_E ASC, ROOT ASC, DEPT ASC

Here is a fiddle.