ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 계층형 쿼리 (Hierarchiacal Query)
    SQL 2020. 2. 18. 08:36

    계층형 쿼리 (Hierarchiacal Query)

     

    1) 상향식 : 최상위 노드에서 시작하여 하위 노드로 내려가는 계층 쿼리

     

    2) 하향식 : 전체 노드를 방문하는게 아니라 자신의 부모노드만 방문

     

     - 오라클에서만 지원하고 있는 막강한 기능 중 하나

     

     - 관계형이라는 의미가 서로 평등하고 수평적인 관계를 의미하는 반면 계층형 구조는 이와는 다르게

     

       평등한 관계가 아닌 계급적이고 수직적인 관계를 가진다.

     

       한마디로 말해서 관계형이 평면적이라고 한다면 계층형은 수직적 구조라고 할 수 있다.

     

       ex) 사회적인 의미의 계급구조

       

            소프트웨어 관점에서 보면 웹 사이트의 답변형 게시판이나 BOM(Bill Of Material) 등

     

                * BOM : 하나의 완제품이 만들어지는데 필요한 구성품목들의 내역 혹은 조합도

     

     

     - 용어 정리

     

      1) 노드 : 원모양으로 표시된 항목

     

                 각각의 품목이 하나의 노드가 되며 실제 테이블에서는 하나의 ROW에 대응된다.

     

      2) 부모 : 부모노드라고도 한다. 트리구조에서 상위에 있는 노드를 말한다.

     

      3) 자식 : 자식노드라고도 한다. 위 그림에서 모니터는 컴퓨터의 자식노드이며, 컴퓨터는 모니터와 본체의

     

                  부모노드라고 한다.

     

       4) 리프 : 리프노드라고 한다. 더 이상 하위에 연결된 노드가 없는 항목을 말한다.

     

                   즉 자식 노드가 없는 노드

     

       5) 루트 : 계층형 트리구조에서 최상위에 있는 노드

     

     

       6) 레벨 : 트리구조에서의 각각의 계층

     

                   루트에 해당되는 컴퓨터가 1레벨이 되며 그 하위에 있는 모니터, 본체등이 2레벨

     

     

    STNTAXS

     

     SELECT ...

     FROM ...

     START WITH 조건1

     CONNECT BY  PRIOR  조건2

     

      -> START WITH 절에 루트노드를 지정

     

           - 루트 노드를 식별, 조건 1을 만족하는 모든 ROW들은 루트 노드가 된다.

     

           - START WITH절 생략가능, 이러한 경우 모든 ROW들을 루트노드로 간주

     

            - 서브쿼리도 사용가능

     

      -> CONNECT BY 절에 부모노드와 자식 노드들간의 관계를 연결

     

            -  PRIOR가 붙은 컬럼이 루트노드

     

     * LPAD( 값 , 총문자길이, 채움문자 )

        - 왼쪽부터 총문자길이 -값의 길이만큼 채움문자를 넣어준다.

     

     * RPAD( 값 , 총문자길이, 채움문자 )

        - 오른쪽부터 총문자길이 -값의 길이만큼 채움문자를 넣어준다.

     

    계층형 쿼리의 행 제한 조건 기술 위치에 따른 결과 비교 (Pruning Branch - 가지치기)

     

     FROM => START WITH

     

     CONNECT BY => WHERE

     

    1. WHERE : 계층 연결을 하고 나서 행을 제한

     

    2. CONNCET BY : 계층 연결을 하는 과정에서 행을 제한하고 계층 연결

     

     WHERE절 기술 전

    WHERE절 기술후

       -> 계층 연결후 org_cd ='정보기획부' 인 한개의 ROW만 제외함

     

     

    CONNECT BY 절에 조건 기술

     -> 계층 연결하는 과정에서 org_cd='정보기획부' 인 ROW가 제한됨에 따라

     

         정보기획부의 모든 자식노드들이 조회가 안됌

     


     

    계층 쿼리 특수함수

     

    종류

     

    1. CONNCET BY_ROOT (컬럼) 

      

       - 최상위 데이터의 컬럼 정보 조회

     

    2. SYS_CONNECT_BY_PATH(컬럼,'구분자')

     

      - 계층 순회 경로 표현, 두번째 인자(경로 표현 구분자)

     

    3. CONNECT_BY_ISLEAF ISLEAF : 현재 행이 마지막 LEAF 노드인지 리턴

     

                                                1 -> 리프노드, 0 -> 리프노드 아님

     

     

    설명

     

     1. CONNECT BY ROOT (컬럼) : 해당 컬럼의 최상위 행의 값을 리턴

     

     

    2. SYS_CONNECT_BY_PATH (컬럼, 구분자) : 해당 행의 컬럼이 거쳐온 컬럼 값을 추적, 구분자로 이어줌

       * LTRIM(해당값, '구분자') : 구분자에 해당하는 값을 왼쪽에서 하나 없애라~

     

     

     

    3. CONNECT_BY_ISLEAF : 해당 행의 LEAF 노드인지 확인

     

    특수 계층 함수를 이용한 실습

     

    게시판 글 순서

     

    사용할 테이블

    ROOT NODE : 답글이 아닌 첫번째 글, 두번째 글, 네번 째 글

     

    START WITH 조건 : PARENT_SEQ가 NULL 

     

    CONNECT BY 조건 PRIOR SEQ = PARENT_SEQ

     * ORDER SIBLINGS BY 컬럼;   -> 계층구조를 유지한채로 정렬

     

    -----> 답글의 순서가 뒤죽박죽인데 이 순서를 맞춰라!!

     

    1. SEQ로만 정렬하면 루트노드 밑의 노드들의 순서를 원하는대로 정렬할 수 없기 때문에

     

       그룹번호 칼럼을 UPDATE

     

    2. 그룹번호 칼럼은 자신들의 ROOT노드의 SEQ값을 받아옴

     

    추가한 그룹번호 칼럼을 이용하여 재정렬

     

    'SQL' 카테고리의 다른 글

    효율적인 쿼리 검색!!!!!  (1) 2020.02.20
    계층 쿼리 누적 합 구하기  (1) 2020.02.20
    달력 쿼리  (0) 2020.02.17
    WITH절  (0) 2020.02.17
    서브쿼리 UPDATE  (0) 2020.02.14

    댓글

Designed by Tistory.