首页 > 解决方案 > 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

编辑:这是场景的小提琴

标签: sqloraclehierarchical

解决方案


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

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

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

这是一个小提琴。


推荐阅读