0

我正在为即将到来的工作面试练习 SQL,需要一些帮助。一位朋友建议我创建一个表并尽可能学习联接。我一直在使用 SQL fiddle,oracle 11g R2。

我的表如下

--------------------------
| ID | Name | Manager_ID | 
--------------------------

不为 0 的 Manager_ID(这些是经理)是具有与某些经理的主键相关的外键的员工。

我试图找出有多少员工向经理报告并显示如下:

--------------------
| Name | Employees | 
--------------------

这是我到目前为止所拥有的,我只是不确定如何在左侧字段中列出他们的名字。

SELECT COUNT(b.manager_id) as "Manages"
FROM employees a, employees b
WHERE b.manager_id > 0 
AND a.id = b.manager_id
GROUP BY a.id  
/

谢谢你的帮助。请保持基本,我仍然是菜鸟。

4

2 回答 2

3

有一个心理技巧:想象你的 3 列表(id、employee、manager_id)是一个 6 列表(employee.id、employee.name、employee.manager_id、manager.id、manager.name、manager.manager_id),其中最后三列已压缩在一个 id 列中。

在您的情况下,它是同一张表,但大多数情况下并非如此,因此很容易在心理上用引用表的列集(id=主键)替换列 ID(外键)。

通常,外部表也是在主表的几行上重复出现的国家或产品线列表。就像在多行上出现相同的 manager_id 一样。

如果外部表的某些行没有被使用(不是所有员工都是经理)没有问题,但是如果主表 id 试图引用外部表中不存在的 id(经理必须管理至少一名员工)。为了表示一个员工没有经理,你输入一个不存在的employee.manager_id,你选择0,通常你使用NULL。

  • 要列出所有拥有经理的员工(除了 CEO 之外的所有人)的完整表格,您可以查询:

    SELECT * FROM employee empl JOIN employee mngr ON empl.manager_id = mngr.id
    

    或(相同)

    SELECT * FROM employee empl, employee mngr WHERE empl.manager_id = mngr.id
    
  • 列出所有员工的完整表格,包括没有经理的员工(每个人)

    SELECT * FROM employee empl LEFT JOIN employee mngr ON empl.manager_id = mngr.id
    

您的问题是获取具有管理员工数量的管理人员列表。因此,假设您没有 id=0 的员工:

    SELECT manager.name, COUNT(*)
    FROM   employee empl, employee mngr
    WHERE  empl.manager_id = mngr.id
    GROUP BY mngr.id

要包括所有员工,即使是管理 0 名员工的员工,也可以作为练习留下(左加入)。

于 2013-03-04T21:46:33.940 回答
2

您在这里非常接近,您已经按经理分组,您只需要在您的选择中包含该经理的姓名

SELECT  a.name, COUNT(b.manager_id) as "Employees"
FROM employees a, employees b
WHERE b.manager_id > 0 
AND a.id = b.manager_id
GROUP BY a.name, a.id 
于 2013-03-04T20:42:51.833 回答