左联接或内联接

时间:2019-07-12 02:15:15

标签: sql oracle

我有一个表,Table_employee有员工ID,薪水,经理(每个员工各自经理的ID)和另一个表 Table_manager,其中包含每个经理的名字,姓氏和每个经理的ID。

我试图创建另一个表,该表显示经理的名字,姓氏以及每个经理负责的员工人数以及这些员工的总薪水。

我很难提供经理的名字和姓氏。

我的代码如下。任何帮助将不胜感激。

非常感谢您!

select 
   e.manager, 
   COUNT(e.employee_id), 
   SUM(e.salary) 
FROM 
   Table_employee e 
   Right outer join Table_manager m ON e.manager=m.employee_id 
GROUP BY 
   manager 
ORDER BY 
   manager

2 个答案:

答案 0 :(得分:2)

使用LEFT JOIN和聚合。如果您正在学习SQL,请忘记RIGHT JOIN。几乎不需要它。并且LEFT JOIN更易于遵循(“保留 first 表中的所有内容”与“保留 last 表中的所有内容,不管是什么”)。 / p>

所以:

select m.employee_id, m.firstname, m.lastname, 
       count(e.employee_id), sum(e.salary)
from Table_manager m left join
     Table_employee e
     ON e.manager = m.employee_id
group by m.employee_id, m.firstname, m.lastname
order by m.employee_id;

答案 1 :(得分:1)

您只需要按组添加姓氏和名字?我错过了一些复杂性吗?

select e.manager, m.firstname, m.lastname, COUNT(e.employee_id), SUM(e.salary)
FROM Table_employee e
Right outer join Table_manager m ON e.manager=m.employee_id\
GROUP BY manager, m.firstname, m.lastname
ORDER BY manager

但是,交换订单以使经理在左边而雇员在右边是更有意义的,这样您就不会错过没有雇员的经理:

select e.manager, m.firstname, m.lastname, COUNT(e.employee_id), SUM(e.salary)
FROM Table_manager m
Right outer join Table_employee e ON e.manager=m.employee_id
GROUP BY manager, m.firstname, m.lastname
ORDER BY manager