SQL 获取所有孩子

问题描述

所以我有按部门组织的分层数据,除了最上面的部门外,每个部门都有一个父部门。我现在想写一个 SELECT 语句,以累积的方式选择这个层次结构。这意味着对于层次结构中的每个级别,我都希望查看作为其子项的所有条目。

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

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 来解析层次结构并检索部门可以连接到根的每种可能方式,然后将其与员工表连接。

你能试一试吗,让我知道它是否有效?

WITH RCTE_DEPT(id,root,parent_id) AS(
  SELECT id,parent_id,id
  FROM dept
  UNION ALL
  SELECT dept.id,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.