sql - 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
编辑:这是场景的小提琴
解决方案
我想出了一个解决方案,使用递归 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
推荐阅读
- php - Shopware6 : 支付订单时要订阅哪个事件?
- excel - 使用 VBA 粘贴转置数组
- ajax - 如何用新结果或使用 ajax 的视图替换部分视图
- node.js - 未经授权的axios提出没有数据的请求
- python - 为什么在我的 venv 中找不到 Pathlib 模块?
- c++ - 使用 QProcess 在 Qt(C++) 中使用 WinRar 解压缩 - 提取目录问题
- perforce - 有没有办法恢复最后创建的 perforce 搁置的 ID/编号?
- vb6 - VB6 - 以下操作做什么:x = b(1) + b(2) * &H100&?
- javascript - 从指标/股票工具添加系列时动态添加新轴
- javascript - 在 JavaScript 中垂直打印单词