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
我想出了一个解决方案,使用递归 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
所以我有按部门组织的分层数据,每个部门都有一个 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
我想出了一个解决方案,使用递归 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