我想在 oracle SQL 中查找所有经理姓名及其所有经理姓名
Posted
技术标签:
【中文标题】我想在 oracle SQL 中查找所有经理姓名及其所有经理姓名【英文标题】:i want to find all managers names and their all managers name in 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
)
);
【问题讨论】:
【参考方案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>
选择最适合您的。我相信其他成员会提出其他选择。
【讨论】:
以上是关于我想在 oracle SQL 中查找所有经理姓名及其所有经理姓名的主要内容,如果未能解决你的问题,请参考以下文章
如何在 pl/sql (oracle 9i) 中查找数据类型的大小?
在 oracle 中使用正则表达式查找 POBOX - PL/SQL