본문 바로가기

sql

11-4. 데이터 조작 언어(계층형 질의문)

728x90
반응형

계층형 질의문

 

 "데이터의 서열을 결과로 시각화하는 sql "

 

:

select level, empno, ename, mgr

 from emp

 start with ename = 'KING'

 connect by prior empno =  mgr;

level 출력하기 위해

start with/connect by 사용한다.

 

-START WITH/CONNECT BY

 

 

select level from emp

 start with ename = 'KING'

 connect by prior empno =  mgr

 

start with 컬럼명 = TREE최상위 객체의 LEVEL

connect by prior 현재level = 상위level

 

 

문제460.

start with 데이터를 BLAKE 변경해서

출력하시오

 

select level, empno, ename, mgr

 from emp

 start with ename = 'BLAKE'

 connect by prior empno =  mgr;

 

 

전체모식도

 

 

 

 

문제461.

다시 KING 부터 전체 사원을 출력하는데

BLAKE 제외하 출력하시오

 

 

select level, empno, ename, mgr

 from emp

where empno not in 7698

 start with ename = 'KING'

 connect by prior empno =  mgr;

 

 

또는

select level, empno, ename, mgr

 from emp

where ename != 'BLAKE'

 start with ename = 'KING'

 connect by prior empno =  mgr;

 

 

 

문제462.

위의 결과를 다시 출력하는데

BLAKE 포함해서 BLAKE 팀원들이

출력되지 않게 하시오

 

select level, empno, ename, mgr

 from emp

 start with ename = 'KING'

 connect by prior empno =  mgr

 and

                      ename != 'BLAKE';

 

 

 

 

문제463.

다시 전체를 출력하는데

월급이 높은 사원부터 출력하시오

 

select level, empno, ename, mgr

 from emp

 start with ename = 'KING'

 connect by prior empno =  mgr

order by sal desc;

 

월급순서대로 출력되서

레벨순서가 깨짐.

 

 

 

문제464.

위의 결과를 다시 출력하는데

서열이 깨지지 않는 상태에서

월급이 높은 사원순으로 출력되게 하시오.

(RPAD 이용해서

서열별로 구분되게 뽑으시오)

 

select level, empno, ename, sal

 from emp

 start with ename = 'KING'

 connect by prior empno =  mgr

order siblings by sal desc;

 

 

select rpad('   ', level*2) || ename, sal

 from emp

 start with ename = 'KING'

 connect by prior empno =  mgr

order siblings by sal desc;

 

 

상사 king 대한 , 스캇, 아담스

    상사 frod 대한 스미스

    상사 blake 대한 알렌,터너, 와드, 마틴

*소속을 보여 주기 위해

 띄어쓰기가 달라져서 출력된다*

 

 

 

 

문제465.

계층형 질의문과 짝꿍 함수인 sys_connect_by 함수를 이용해서 아래의 결과를 출력하시오 !

 

select ename,

 sys_connect_by_path(ename, '/') as path,

empno, mgr

 from emp

 start with ename = 'KING'

 connect by prior empno = mgr;

 

 

 

sys_connect_by_path(path_name, 'path 구분자')

TREE 구조에서 ROOT 찾아주는 함수이다.

PATH_NAME 부분에는 TREE 구조의 계층 이름에 해당하는 컬럼명을 적어준다.

 

최상위가 KING 이어서

SYS_CONNECT_BY_PATH 함수에서 뿌리 된다.

그래서 모든 행에 KING 있는 것이다.

그리고 킹에서 부터 각각의 큰뿌리/작은뿌리들을

PATH 표현한다.

 

 

 

 

 

문제466.(오늘의 마지막 문제)

아래와 같이 결과를 출력하시오

 

여기서 king 앞의 / 없애서

출력하시오

select ename,

substr(sys_connect_by_path(ename, '/'),  2) as path

 from emp

 start with ename = 'KING'

 connect by prior empno = mgr;

 

 

다른

select ename, 

ltrim(sys_connect_by_path(ename,'/'),'/') as path

from emp

start with ename='KING'

connect by prior empno = mgr ;

 

 

 

 

화면 캡처: 2018-10-31 오후 4:54

728x90
반응형

'sql' 카테고리의 다른 글

13. DATABASE OBJECT(VIEW, SEQUENCE, SYNONYM)  (0) 2019.03.31
12. 제약  (0) 2019.03.31
11-3. 데이터 조작 언어(DCL문)  (0) 2019.03.31
11-2. 데이터 조작 언어(DDL문)  (0) 2019.03.30
11-1. 데이터 조작 언어(TCL문)  (0) 2019.03.30