嵌套查询以获取经理下的员工数量
nested query to get number of employees under managers
create table employee (
Id int,
ManagerId int);
insert into employee values
(1, 3),
(2, 3),
(3, 6),
(4, 7),
(5, 7),
(6, 8),
(7, 6);
select * from employee;
这里是 table:
如何编写查询以获取经理及其下属的员工人数。注意嵌套结构。上面例子的结果是
Id | number_of_employees
3 | 2
7 | 2
6 | 6
8 | 7
给你!
With recursive cte as (
select id,Managerid from employee --> Anchor Query
union all
select c.Id,e.ManagerId from cte c --> Recursive Member
join employee e on (c.ManagerId=e.Id)) --> Termination Condition
select ManagerId,count(Id) as Number_of_Employees
from cte group by ManagerId
更新
好的,让我试着解释一下。
首先我们需要生成一个 table 来列出经理下的员工和该经理的经理直到最高级别(所有组合)。应该是下面这样的吧?让我们称之为 Resultant Table
-------------------------
| Id | ManagerId |
-------------------------
| 1 | 3 |--
| 2 | 3 | |
| 3 | 6 | |
| 4 | 7 | |->From your table
| 5 | 7 | |
| 6 | 8 | |
| 7 | 6 |--
| 2 | 6 |--
| 1 | 6 | |
| 7 | 8 | |
| 3 | 8 | |
| 5 | 6 | |-> Nested structure which you meant in the question
| 4 | 6 | |
| 4 | 8 | |
| 5 | 8 | |
| 1 | 8 | |
| 2 | 8 |--
-------------------------
一旦我们实现上述 table,使用 group by
ManagerID 获取 count
是直接查询。那么我们将如何实现这一目标。
1) 我们可以使用
获取直接员工
select Id,ManagerId from employee -- let's call this as QueryE1
2) 现在让我们加入相同的 table 以获得第一级经理和他们的员工
select e1.Id,e2.ManagerId from employee e1 join employee e2 on e1.managerid = e2.id
--QueryE2
-------------------------
| Id | ManagerId |
-------------------------
| 1 | 6 |
| 2 | 6 |
| 3 | 8 |
| 7 | 8 |
| 4 | 6 |
| 5 | 6 |
-------------------------
3) 那么我们应该把上面的table当成Reference table(QueryE2) 并通过与员工 table。这里因为 8 是 6 的经理,所以 6 的所有报告人也是 8 的报告人。
SELECT e3.id,e4.managerid
FROM (SELECT e1.id,e2.managerid
FROM employee e1 JOIN employee e2
ON e1.managerid = e2.id) e3
JOIN employee e4
ON e3.managerid = e4.id -- QueryE3
-------------------------
| Id | ManagerId |
-------------------------
| 1 | 8 |
| 2 | 8 |
| 4 | 8 |
| 5 | 8 |
-------------------------
4) 我们应该重复上面的步骤,直到没有更多的Managers for Managers。现在我们知道 8 没有经理。但是让我们看看查询是怎么说的。现在我们应该以最新的table(以上)作为参考table.
SELECT e5.id,e6.managerid
FROM (SELECT e3.id,e4.managerid
FROM (SELECT e1.id,e2.managerid
FROM employee e1
JOIN employee e2
ON e1.managerid = e2.id) e3
JOIN employee e4
ON e3.managerid = e4.id) e5
JOIN employee e6
ON e5.managerid = e6.id --QueryE4-- returns 0 rows as well
最后,如果我们组合(联合)所有这些查询的所有值,我们将得到所需的结果Table .这整个事情是由我们的 RECURSIVE CTE
在单个查询中完成的。这里 QueryE1
是 Anchor 查询。 QueryE2,QueryE3 & QueryE4
是 Recursive 成员,这些成员由我们的 CTE 创建,直到我们获得 0 行。创建 Resultant Table 后,我们可以使用它来定制我们的需求。这里我们做Group by
来获取ManagerID的count
。我不确定它是否会消除您的困惑,但至少希望您会有所了解 :)
create table employee (
Id int,
ManagerId int);
insert into employee values
(1, 3),
(2, 3),
(3, 6),
(4, 7),
(5, 7),
(6, 8),
(7, 6);
select * from employee;
这里是 table:
如何编写查询以获取经理及其下属的员工人数。注意嵌套结构。上面例子的结果是
Id | number_of_employees
3 | 2
7 | 2
6 | 6
8 | 7
给你!
With recursive cte as (
select id,Managerid from employee --> Anchor Query
union all
select c.Id,e.ManagerId from cte c --> Recursive Member
join employee e on (c.ManagerId=e.Id)) --> Termination Condition
select ManagerId,count(Id) as Number_of_Employees
from cte group by ManagerId
更新
好的,让我试着解释一下。
首先我们需要生成一个 table 来列出经理下的员工和该经理的经理直到最高级别(所有组合)。应该是下面这样的吧?让我们称之为 Resultant Table
-------------------------
| Id | ManagerId |
-------------------------
| 1 | 3 |--
| 2 | 3 | |
| 3 | 6 | |
| 4 | 7 | |->From your table
| 5 | 7 | |
| 6 | 8 | |
| 7 | 6 |--
| 2 | 6 |--
| 1 | 6 | |
| 7 | 8 | |
| 3 | 8 | |
| 5 | 6 | |-> Nested structure which you meant in the question
| 4 | 6 | |
| 4 | 8 | |
| 5 | 8 | |
| 1 | 8 | |
| 2 | 8 |--
-------------------------
一旦我们实现上述 table,使用 group by
ManagerID 获取 count
是直接查询。那么我们将如何实现这一目标。
1) 我们可以使用
获取直接员工select Id,ManagerId from employee -- let's call this as QueryE1
2) 现在让我们加入相同的 table 以获得第一级经理和他们的员工
select e1.Id,e2.ManagerId from employee e1 join employee e2 on e1.managerid = e2.id
--QueryE2
-------------------------
| Id | ManagerId |
-------------------------
| 1 | 6 |
| 2 | 6 |
| 3 | 8 |
| 7 | 8 |
| 4 | 6 |
| 5 | 6 |
-------------------------
3) 那么我们应该把上面的table当成Reference table(QueryE2) 并通过与员工 table。这里因为 8 是 6 的经理,所以 6 的所有报告人也是 8 的报告人。
SELECT e3.id,e4.managerid
FROM (SELECT e1.id,e2.managerid
FROM employee e1 JOIN employee e2
ON e1.managerid = e2.id) e3
JOIN employee e4
ON e3.managerid = e4.id -- QueryE3
-------------------------
| Id | ManagerId |
-------------------------
| 1 | 8 |
| 2 | 8 |
| 4 | 8 |
| 5 | 8 |
-------------------------
4) 我们应该重复上面的步骤,直到没有更多的Managers for Managers。现在我们知道 8 没有经理。但是让我们看看查询是怎么说的。现在我们应该以最新的table(以上)作为参考table.
SELECT e5.id,e6.managerid
FROM (SELECT e3.id,e4.managerid
FROM (SELECT e1.id,e2.managerid
FROM employee e1
JOIN employee e2
ON e1.managerid = e2.id) e3
JOIN employee e4
ON e3.managerid = e4.id) e5
JOIN employee e6
ON e5.managerid = e6.id --QueryE4-- returns 0 rows as well
最后,如果我们组合(联合)所有这些查询的所有值,我们将得到所需的结果Table .这整个事情是由我们的 RECURSIVE CTE
在单个查询中完成的。这里 QueryE1
是 Anchor 查询。 QueryE2,QueryE3 & QueryE4
是 Recursive 成员,这些成员由我们的 CTE 创建,直到我们获得 0 行。创建 Resultant Table 后,我们可以使用它来定制我们的需求。这里我们做Group by
来获取ManagerID的count
。我不确定它是否会消除您的困惑,但至少希望您会有所了解 :)