带有空值的 SQL 自连接

Rah*_*kar 3 mysql sql

我将所有员工(经理和员工)放在一张名为“员工”的表下。表如下所示,

桌子

+-------+------------+---------+---------+------------+
|emp_id | name       | dept_id | salary  | manager_id |
+=======+============+=========+=========+============+
|  1    | Sally      |   1     | 20000   |  null      |
|  2    | Ajit       |   2     | 20000   |   1        |
|  3    | Rahul      |   1     | 20000   |   1        |
|  4    | uday       |   1     | 20000   |   null     |
|  5    | john       |   1     | 20000   |   null     |
|  6    | netaji     |   2     | 20000   |    2       |
|  7    | prakriti   |   3     | 1111    |    3       |
|  8    | sachin     |   3     | 1111    |    3       |
|  9    | santosh    |   1     | 1111    |    2       |
|  10   | Ravi       |   1     | 1111    |    2       |
+-------+------------+---------+---------+------------+
Run Code Online (Sandbox Code Playgroud)

经理和员工都属于同一张表。manager_id 指= emp_id 是经理。

我想编写查询来计算属于每个经理的员工数量。因此,即使某个经理手下没有任何员工,计数也会显示为 0

结果应如下所示,

预期输出

+------+----------+
|Count |  Manager |
+======+==========+
| 2    |  Sally   |
| 3    |  Ajit    |
| 2    |  Rahul   |
| 0    |  Uday    |
| 0    |  John    |
+------+----------+
Run Code Online (Sandbox Code Playgroud)

Mik*_* D. 5

您需要在桌子上进行左自连接。左连接将确保每个经理都有一行,即使他们下面没有员工。如果经理没有员工,您需要COUNT()在联接的员工端的字段上使用聚合。实际上并不计算 NULL,因此这应该在您想要的地方给出零。NULLCOUNT()

此查询中的子句WHERE通过查看经理是否manager_id为 NULL 或者连接表中是否有任何匹配项来定义经理,这意味着有人将他们设置为经理。

SELECT mgr.name, COUNT(emp.emp_id) AS employee_count
FROM Employee AS mgr
LEFT JOIN Employee AS emp ON emp.manager_id=mgr.emp_id
WHERE mgr.manager_id IS NULL OR emp.emp_id IS NOT NULL
GROUP BY mgr.name
Run Code Online (Sandbox Code Playgroud)