본문 바로가기

오라클

계층형 쿼리(Hierarchical Query)

ex)tblComputer 테이블

컴퓨터 

    -본체

        -메인보드

        -그래픽카드

        -랜카드

        -메모리

    -모니터

        -보호필름

    -프린터

        -잉크 카트리지

        -A4 용지


create table tblComputer

(

    seq number primary key, --PK

    name varchar2(100) not null, --요소명

    qty number not null, --수량

    pseq number references tblComputer(seq) --부모부품(FK)

);


1. 셀프 조인

: inner join or outer join > 동일한 테이블을 가지고 실행 


select * from tblComputer c1 

inner join tblComputer c2

on c1.seq = c2.pseq; -- c1(부모) , c2(자식)



2. 계층형 쿼리

: start with 절 connect by 절


select * from tblComputer

start with seq = 1 -루트 노느 지정

connect by prior seq = pseq; -부모 자식 연결 고리(PK=FK)


**계층형 쿼리의 의사 컬럼(level)

select name,level from tblComputer 

start with seq =1

connect by prior seq = pseq;


**계층형 쿼리의 의사컬럼(prior) : 부모 레코드 참조 

<prior (부모레코드 컬럼 이름)>

select name,level, prior qty from tblComputer 

start with seq =1

connect by prior seq = pseq;


-------------------------------------------------------------------------------------------------------

-- 계층형 게시판


select 


    lpad(' ',(level-1) *5) || name as "현재 카테고리",

    prior name as "부모 카테고리",

    connect_by_root name as "루트 카테고리",--자기가 속한 그룹의 루트

    connect_by_isleaf ,--0 : 자식이 있는 /1 : 자식이 없는

    sys_connect_by_path(name,'▷') as "경로" --계층구조 경로 (path) // sys_connect_by_path(컬럼명,'구분자')

    from tblCategory

    start with pseq is null

        connect by prior seq = pseq

            order siblings by name asc;




------------------------------------------------------------------------------

[START WITH 조건1] [CONNECT BY 조건2]

- START WITH 조건1 : 루트노드를 식별한다. 조건1을 만족하는 모든 ROW 들은 루트노드가 된다./ 조건1에는 서브쿼리도 올수있다.

- CONNECT BY 조건2 : 부모와 자식노드들 간의 관계를 명시하는 부분이다./

 조건2에는 반드시 PRIOR연산자를 포함시켜야 하며, 이는 부모노드의 컬럼을 식별하는데 사용된다./ 조건2에는 서브쿼리가 올수 없다.


*PRIOR연산자

- 오직 계층형 쿼리에서만 사용하는 오라클 SQL연산자이다. 

- CONNECT BY절에서 =와 동등한 레벨로 사용되는 연산자이며, CONNECT BY절에서 해당 컬럼의 부모ROW를 식별하는데 사용된다.



*LEVEL 의사컬럼

- 계층형 정보를 표현할 때 레벨을 나타낸다.

- 일반적인 컬럼처럼 SELECT, WHERE, OREDER BY 절에서 사용할 수 있다.


*CONNECT_BY_ROOT 컬럼

- 루트노드 찾기


*CONNECT_BY_ISCYCLE

- 중복 참조값 찾기

- 반드시 CONNECT BY절에 NOCYCLE이 명시되어 있어야 사용이 가능하다.


*CONNECT_BY_ISLEAF

- 리프노드 찾기 

- 리프노드에 해당하면 1 / 그렇지 않으면 0을 반환


*SYS_CONNECT_BY_PATH 

- 루트 찾아가기



'오라클' 카테고리의 다른 글

Group by 절  (0) 2018.09.06
사용자 계정(SQL)  (0) 2018.09.06
페이징 (웹)  (0) 2018.09.05
Alter/Drop (DDL)  (0) 2018.09.04
인덱스(Index)  (0) 2018.09.04