Nếu tôi hiểu bạn đúng, bạn chỉ muốn chọn những người quản lý.
Ví dụ sau đây dựa trên lược đồ của Scott.
Dưới đây là tất cả nhân viên, cùng với người quản lý của họ (theo thứ bậc) để việc phát hiện người quản lý dễ dàng hơn.
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
bổ sung mệnh đề chỉ trả lại người quản lý:
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>
Thay thế cái gì đang được chọn với SYS_CONNECT_BY_PATH
, chúng tôi sẽ nhận được một đầu ra khác:
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>
Hoặc, làm theo các bước của bạn, với sự tự tham gia của EMP
bảng, chúng tôi nhận được
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>
Chọn một trong những phù hợp với bạn nhất. Tôi tin rằng các thành viên khác sẽ đề xuất các lựa chọn khác.