嵌套查询以获取经理下的员工数量

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

Demo

更新

好的,让我试着解释一下。

首先我们需要生成一个 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 在单个查询中完成的。这里 QueryE1Anchor 查询。 QueryE2,QueryE3 & QueryE4Recursive 成员,这些成员由我们的 CTE 创建,直到我们获得 0 行。创建 Resultant Table 后,我们可以使用它来定制我们的需求。这里我们做Group by来获取ManagerID的count。我不确定它是否会消除您的困惑,但至少希望您会有所了解 :)