【问题标题】:Complex SQL Queries (self joins and left joins)复杂的 SQL 查询(自连接和左连接)
【发布时间】:2014-01-31 21:53:11
【问题描述】:

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

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

我正在尝试找出如何列出每个部门的经理姓名和员工姓名。我可以列出经理 ID 号和员工姓名,但是从经理 ID 到经理姓名让我很难过。

感谢您的帮助。

【问题讨论】:

  • 如果您使用的是 SQL*Plus,这是 Oracle 吗?
  • 是的,我正在使用 Oracle 11g 附带的 SQL Plus 命令行

标签: sql oracle11g


【解决方案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

【讨论】:

  • 如果您执行OUTER JOIN(或者在Oracle 中也为(+)),您将不会过滤掉部门没有经理的员工...
  • 如果我这样做,我并没有完全关注你:SELECT Name, DeptHeadID FROM Employees, Department WHERE Employees.DeptID=Department.DeptID;我得到每个部门列出的 DeptHeadID 和员工,但我想要 DeptHeadID 的名称,但名称在员工表中。所以我不知道如何从部门中的 DeptHeadID 获取员工表中匹配的 EmpID 的名称
  • 这就是为什么您需要将Employee 表连接两次。即使是同一张表,也可以独立使用emp1emp2(一个获取员工数据,一个获取经理)
【解决方案2】:

类似这样的使用子查询

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

【讨论】:

    【解决方案3】:
    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
    

    【讨论】:

      【解决方案4】:

      扩展 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
      

      【讨论】:

        【解决方案5】:

        select e.ename MGRNAME,m.ename EMPNAME from emp e join emp m on e.empno = m.mgr;

        这可能会对你有所帮助。

        【讨论】:

          猜你喜欢
          • 2012-11-29
          • 2010-11-02
          • 2023-03-08
          • 1970-01-01
          • 2021-12-25
          • 2015-01-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多