问题描述
所以我有按部门组织的分层数据,除了最上面的部门外,每个部门都有一个父部门。我现在想写一个 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