我如何使用计数和自联接

时间:2013-03-04 20:37:44

标签: sql oracle

我正在为即将到来的求职面试练习SQL,需要一些帮助。一位朋友建议我创建一个表并尽可能地学习连接。我一直在使用SQL小提琴,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  
/

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

2 个答案:

答案 0 :(得分: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 

答案 1 :(得分:2)

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

在你的情况下,它是同一个表,但通常不是,因此很容易通过引用表的列集(在id = primary时)精神上替换column-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名员工的员工)包括在内(左连接)作为练习。