【问题标题】:i want to find all managers names and their all managers name in oracle SQL我想在 oracle SQL 中查找所有经理姓名及其所有经理姓名
【发布时间】:2018-07-28 07:09:52
【问题描述】:
select e.last_name, ee.last_name 
from employees e join employees ee on (e.manager_id = ee.employee_id) 
where last_name in (select last_name 
                    from employees 
                    where employee_id in (select distinct manager_id 
                                          from employees
                                         )
                   );

【问题讨论】:

    标签: sql oracle oracle11g


    【解决方案1】:

    如果我理解正确,您只想选择经理。

    以下示例基于 Scott 的架构。

    这里是所有员工及其经理(按层级),以便更容易发现经理。

    SQL> select lpad(' ', (level - 1) * 2) || ename ename
      2  from emp
      3  start with mgr is null
      4  connect by prior empno = mgr;
    
    ENAME
    ------------------------------------------------------
    KING              -- manager
      JONES           -- manager
        FORD          -- manager
          SMITH       -- employee
      BLAKE           -- manager
        ALLEN         -- employee
        WARD          -- employee
        MARTIN        -- employee
        TURNER        -- employee
        JAMES         -- employee
      CLARK           -- manager
        MILLER        -- employee
    
    12 rows selected.
    
    SQL>
    

    附加的WHERE 子句仅返回经理:

    SQL> select lpad(' ', (level - 1) * 2) || ename ename
      2  from emp
      3  where empno in (select mgr from emp)
      4  start with mgr is null
      5  connect by prior empno = mgr;
    
    ENAME
    --------------------------------------------------------
    KING
      JONES
        FORD
      BLAKE
      CLARK
    
    SQL>
    

    SYS_CONNECT_BY_PATH 替换什么,我们将得到不同的输出:

    SQL> select sys_connect_by_path(ename, ' / ') path
      2  from emp
      3  where empno in (select mgr from emp)
      4  start with mgr is null
      5  connect by prior empno = mgr;
    
    PATH
    ----------------------------------------------------
     / KING
     / KING / JONES
     / KING / JONES / FORD
     / KING / BLAKE
     / KING / CLARK
    
    SQL>
    

    或者,按照您的步骤,通过EMP 表的自联接,我们得到

    SQL> select m1.ename manager, m2.ename his_manager
      2  from emp m1 join emp m2 on m1.mgr = m2.empno
      3  where m1.empno in (select mgr from emp);
    
    MANAGER    HIS_MANAGER
    ---------- -------------
    FORD       JONES
    CLARK      KING
    BLAKE      KING
    JONES      KING
    
    SQL>
    

    选择最适合您的。我相信其他成员会提出其他选择。

    【讨论】:

      猜你喜欢
      • 2021-07-22
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      • 2017-01-07
      • 2019-02-13
      • 2022-11-18
      • 2023-01-16
      • 1970-01-01
      相关资源
      最近更新 更多