SQL查询以递归方式获取经理下所有员工的姓名
Posted
技术标签:
【中文标题】SQL查询以递归方式获取经理下所有员工的姓名【英文标题】:SQL Query to get name of all employees under a manager recursively 【发布时间】:2021-12-30 10:52:56 【问题描述】:我正在寻找一个查询,以递归方式获取特定经理下所有员工的姓名。
EMP_TABLE
EMP_ID EMP_NAME MANAGER_ID
1 A 3
2 B 3
3 C 4
4 D 5
5 E NULL
查询:
SELECT EMP_ID, EMP_NAME, MANAGER_ID FROM EMP_TABLE WHERE MANAGER_ID=4;
此查询的输出:
EMP_ID EMP_NAME MANAGER_ID
3 C 4
预期输出:
EMP_ID EMP_NAME MANAGER_ID
1 A 3
2 B 3
3 C 4
【问题讨论】:
【参考方案1】:需要使用 CONNECT BY 处理表中的分层数据:
https://docs.snowflake.com/en/sql-reference/constructs/connect-by.html
SELECT EMP_ID, EMP_NAME, MANAGER_ID FROM EMP_TABLE
START WITH MANAGER_ID=4
CONNECT BY MANAGER_ID = prior EMP_ID
ORDER BY EMP_ID;
+--------+----------+------------+
| EMP_ID | EMP_NAME | MANAGER_ID |
+--------+----------+------------+
| 1 | A | 3 |
| 2 | B | 3 |
| 3 | C | 4 |
+--------+----------+------------+
【讨论】:
Gokhan Atil OMG!你很棒。真的很棒的答案。它解决了我的问题。【参考方案2】:CONNECT BY
的解决方案很清楚。
这里有一个递归解决方案:
WITH rec AS (
SELECT EMP_ID, EMP_NAME, MANAGER_ID
FROM EMP_TABLE
WHERE MANAGER_ID=4
UNION ALL
SELECT tb.EMP_ID, tb.EMP_NAME, tb.MANAGER_ID
FROM rec AS ta
JOIN EMP_TABLE AS tb ON ta.EMP_ID = tb.MANAGER_ID
)
SELECT EMP_ID, EMP_NAME, MANAGER_ID
FROM rec
ORDER BY 1;
【讨论】:
【参考方案3】:您可以使用这个简单的查询 SELECT * FROM EMP_TABLE WHERE MANAGER_ID 不为 NULL
【讨论】:
Abhay S:如果 manager_id=5,您的查询将如何工作。我的问题是递归结果。 如果您需要递归结果,那么这个文档可以帮助您。此查询的简单结果 haughtcodeworks.com/blog/software-development/… SELECT* FROM EMP_TABLE START WITH MANAGER_ID=5 CONNECT BY MANAGER_ID = prior EMP_ID ORDER BY EMP_ID;以上是关于SQL查询以递归方式获取经理下所有员工的姓名的主要内容,如果未能解决你的问题,请参考以下文章