网站用什么字体做正文,邯郸网站建设公司排名,淘宝上开个网站建设,360建筑网发布的信息怎么删除力扣题
1、题目地址
1270. 向公司 CEO 汇报工作的所有人
2、模拟表
员工表#xff1a;Employees
Column NameTypeemployee_idintemployee_namevarcharmanager_idint
employee_id 是这个表具有唯一值的列。这个表中每一行中#xff0c;employee_id 表示职工的 ID#x…力扣题
1、题目地址
1270. 向公司 CEO 汇报工作的所有人
2、模拟表
员工表Employees
Column NameTypeemployee_idintemployee_namevarcharmanager_idint
employee_id 是这个表具有唯一值的列。这个表中每一行中employee_id 表示职工的 IDemployee_name 表示职工的名字manager_id 表示该职工汇报工作的直线经理。这个公司 CEO 是 employee_id 1 的人。
3、要求
编写解决方案找出所有直接或间接向公司 CEO 汇报工作的职工的 employee_id 。
由于公司规模较小经理之间的间接关系 不超过 3 个经理 。
可以以 任何顺序 返回无重复项的结果。
返回结果示例如下。
示例 1
输入 Employees 表
employee_idemployee_namemanager_id1Boss13Alice32Bob14Daniel27Luis48Jhon39Angela877Robert1
输出
employee_id27747
解释 公司 CEO 的 employee_id 是 1. employee_id 是 2 和 77 的职员直接汇报给公司 CEO。 employee_id 是 4 的职员间接汇报给公司 CEO 4 -- 2 -- 1 。 employee_id 是 7 的职员间接汇报给公司 CEO 7 -- 4 -- 2 -- 1 。 employee_id 是 3, 8 9 的职员不会直接或间接的汇报给公司 CEO。
4、代码编写
我的写法
代码
SELECT employee_id
FROM Employees
WHERE manager_id 1 AND employee_id ! 1
UNION ALL
SELECT employee_id
FROM Employees
WHERE manager_id IN (SELECT employee_idFROM EmployeesWHERE manager_id 1 AND employee_id ! 1
)
UNION ALL
SELECT employee_id
FROM Employees
WHERE manager_id IN (SELECT employee_idFROM EmployeesWHERE manager_id IN (SELECT employee_idFROM EmployeesWHERE manager_id 1 AND employee_id ! 1)
)代码分析
要求里面有提到由于公司规模较小经理之间的间接关系 不超过 3 个经理 所以分为三个即可。
直接连接经理(第一个)
SELECT employee_id
FROM Employees
WHERE manager_id 1 AND employee_id ! 1间接连接经理(UNION ALL 连接重复不去重第二个和第三个)
SELECT employee_id
FROM Employees
WHERE manager_id IN (SELECT employee_idFROM EmployeesWHERE manager_id 1 AND employee_id ! 1
)
UNION ALL
SELECT employee_id
FROM Employees
WHERE manager_id IN (SELECT employee_idFROM EmployeesWHERE manager_id IN (SELECT employee_idFROM EmployeesWHERE manager_id 1 AND employee_id ! 1)
)网友给出的连表写法适用于关系层次不深的情景
代码
SELECT DISTINCT e1.employee_id
FROM Employees e1, Employees e2, Employees e3
WHERE e1.manager_id e2.employee_id
AND e2.manager_id e3.employee_id
AND e3.manager_id 1
AND e1.employee_id ! 1代码分析
1、e1.employee_id ! 1 这个是排除掉经理3、2、4、7、8、9、77 2、e3.manager_id 1 这个是找出直接连接经理的员工277 3、e2.manager_id e3.employee_id 这个是找出直接连接经理的员工的下级员工2 - 477 4、e1.manager_id e2.employee_id 这个是找出上面第 3 点下级员工的下级员工2 - 4 - 777
要从连表去分析太乱了上面已经是我暂时能理解到的了。 有比较好的理解的小伙伴可以在评论区发表一下自己的见解。
递归写法
with recursive 递归语法知识
1、在 with… as 中声明需要递归的字段
语法
WITH RECURSIVE 表名 (n) AS
( select 初始值 from tableunion allselect 递归内容 from 表名 where (终止条件)
)
[ SELECT | INSERT | UPDATE | DELETE ]例子
WITH RECURSIVE cte (n) AS
(SELECT 1 # 初始值UNION ALLSELECT n 1 FROM cte WHERE n 5 # 递归内容 from cte 表
)
SELECT * FROM cte;输出结果
-----
| n |
-----
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
-----如上所示可以看出上面 SELECT 1 就代表了输出结果 第一行的数据也决定了 n 的初始值就是 1下面 SELECT n 1 FROM cte WHERE n 5 是根据上面标注 cte(n) 的 n 为递归字段重复查询时只要 n 5 就不断执行 n 1 操作当 n 4 时n 满足小于 5 的条件查询出 n 1 5输出 5n 也变成 5这时不满足 n 5 的条件就查询结束了。
2、在 sql 语句中第一段的初始值内声明变量
语法
WITH recursive 表名 AS ( 初始语句非递归部分 UNION ALL 递归部分语句
)
[ SELECT | INSERT | UPDATE | DELETE ]例子
WITH RECURSIVE cte AS
(SELECT 1 AS n, CAST(abc AS CHAR(20)) AS strUNION ALLSELECT n 1, CONCAT(str, str) FROM cte WHERE n 3
)
SELECT * FROM cte;输出结果
-------------------
| n | str |
-------------------
| 1 | abc |
| 2 | abcabc |
| 3 | abcabcabcabc |
-------------------如上所示可以看出 SELECT 1 AS n, CAST(abc AS CHAR(20)) AS str 代表了输出结果 第一行的数据也决定了 n 的初始值是 1str 的初始值是 abc两个都为递归字段和上面一样只要满足下面递归语句的条件 n 3就累积操作n 1 就是 1 → 2 → 3CONCAT(str, str) 就是 abc → abcabc → abcabcabcabc
3、参考
SQLWith recursive 递归用法 MySQL8 使用 with recursive 实现递归
代码
WITH RECURSIVE cte AS
(SELECT employee_id FROM Employees a WHERE employee_id ! 1 AND manager_id 1UNION ALLSELECT a.employee_id FROM Employees AS a JOIN cte AS b ON a.manager_id b.employee_id
)
SELECT * FROM cte;代码分析
1、对 employee_id 进行初始化操作赋予初始值也为递归字段查询到直接连接经理的员工(277)
SELECT employee_id
FROM Employees
WHERE employee_id ! 1 AND manager_id 12、开始时上面初始化操作后直接 employee_id 赋值到 b.employee_id再查询出 a.employee_id 赋值到 employee_id其实来说 employee_id 就是 b.employee_id我们可以看到上面 sqlWITH RECURSIVE cte AS 用了 cte初始值用了 employee_id 作为递归字段下面递归语句里面 cte 别名为 b那肯定 b.employee_id 就是 employee_id 了如果有说错可以标注或评论指出这里就相当于是查询出直接连接经理员工下面的间接员工2 - 4772 - 4 - 777
SELECT a.employee_id
FROM Employees AS a
JOIN cte AS b ON a.manager_id b.employee_id3、第一次277第二次2 - 477第三次2 - 4 - 777
SELECT * FROM cte;4、会发现确实是 2 和 77 直接连接经理先输出之后再输出间接连接经理的
| employee_id |
| ----------- |
| 2 |
| 77 |
| 4 |
| 7 |