Ако правилно съм те разбрал, искаш да избираш само мениджъри.
Следващият пример е базиран на схемата на Скот.
Тук са всички служители, заедно с техните мениджъри (йерархично), така че да е по-лесно да ги забележите.
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>
Изберете този, който ви подхожда най-добре. Вярвам, че други членове ще предложат други опции.