复杂SQL查询(自联接和左联接)

时间:2014-01-31 21:53:12

标签: sql oracle11g

我有两个表部门和员工。部门有部门信息,每行是由deptID标识的不同部门,名称为DeptName。在每一行中都有一个DeptHeadID,它保存该部门经理的员工ID。

员工拥有员工信息,其中每一行都是由EmpID标识的不同员工,他们的名称是姓名,每行都有一个指向部门表的deptID。

我正在试图弄清楚如何列出每个部门的经理姓名和员工姓名。我可以列出经理身份证号码和员工姓名,但从经理身份证号码到经理人姓名,我很难过。

感谢您的帮助。

5 个答案:

答案 0 :(得分:1)

与从员工到部门完全相同。

当然,如果您只使用Employee表的一个“副本”,则WHERE子句(EmployeeId = ManagerId)会过滤掉所有非经理的员工,因此您可能必须使用超过一份。

SELECT ....
    from Employee empl1, -- Use this to get the data of the employees
         Department dep, -- Join empl1 to find the employee department
         Employee empl2, -- Join dep with this to get the manager data

答案 1 :(得分:0)

使用子查询

这样的事情
select empname,deptname,
(select empname from Employees where empid = DeptHeadID) as Managers
from
(
select e.empname,d.deptname,d.DeptHeadID from Employees e join 
Departments d on e.deptID = d.deptID 
) tab

答案 2 :(得分:0)

select a.department_id,
       a.manager_id,
       b.employee_id,
       b.first_name EmployeeName,
       b.ManagerName 
from (
    select d.department_id,
           d.manager_id
    from departments  d
) a
,(
    select manager_id,
           employee_id,
           first_name,
           (select first_name from employees b 
             where b.employee_id=a.manager_id) as ManagerName
    from employees a
) b
where a.manager_id=b.manager_id

答案 3 :(得分:0)

扩展SJuan76的答案以允许直接复制粘贴:

SELECT dep.department_id,
       dep.manager_id,
       empl1.employee_id,
       empl1.first_name EmployeeName,
       empl2.first_name ManagerName 
FROM Employee empl1 -- Use this to get the data of the employees
JOIN Department dep -- Join empl1 to find the employee department
  ON empl1.deptID = dep.deptID
JOIN Employee empl2 -- Join dep with this to get the manager data
  ON empl2.deptID = dep.manager_id

答案 4 :(得分:0)

选择e.ename MGRNAME,m.eename EMPNAME from emp e join emp m on e.empno = m.mgr;

这可能会对你有帮助。