Open Source RDBMS - Seamless, Scalable, Stable and Free

한국어 | Login |Register

Versions available for this page: CUBRID 8.2.1 |  CUBRID 8.3.0 |  CUBRID 8.3.1 |  CUBRID 8.4.0 |  CUBRID 8.4.1 |  CUBRID 8.4.3 |  CUBRID 9.0.0 | 

계층 질의문 사용 예

SELECT 문에 CONNECT BY 절을 명시하여 계층 질의문을 작성하는 예이다.

재귀적 참조 관계를 가지는 테이블을 생성했으며, 이 테이블은 ID와 ParentID라는 두 개의 컬럼으로 구성되고, ID와 ParentID는 각각 기본 키와 외래 키로 정의된다고 가정한다. 이때, 루트 노드의 ParentID 값은 NULL이 된다.

테이블이 생성되었다면, 아래와 같이 UNION ALL을 이용하여 계층 구조를 가지는 전체 데이터와 LEVEL 값을 조회할 수 있다.

SELECT L1.ID, L1.ParentID, ..., 1 AS [Level]

    FROM tree_table AS L1

    WHERE L1.ParentID IS NULL

UNION ALL

SELECT L2.ID, L2.ParentID, ..., 2 AS [Level]

    FROM tree_table AS L1

        INNER JOIN tree_table AS L2 ON L1.ID=L2.ParentID

    WHERE L1.ParentID IS NULL

UNION ALL

SELECT L3.ID, L3.ParentID, ..., 3 AS [Level]

    FROM tree_table AS L1

        INNER JOIN tree_table AS L2 ON L1.ID=L2.ParentID

        INNER JOIN tree_table AS L3 ON L2.ID=L3.ParentID

    WHERE L1.ParentID IS NULL

UNION ALL ...

계층 관계를 가지는 데이터의 레벨이 얼마나 될지 예측할 수 없으므로, 위 질의문은 새로운 행이 검색되지 않을 때까지 루프를 도는 저장 프로시저(STORED PROCEDURE) 문으로 재작성할 수 있다.

그러나 루프를 도는 동안 각 단계마다 계층 트리를 확인해야 하므로, 아래와 같이 SELECT 문에 CONNECT BY 절을 명시하여 계층 질의문을 재작성할 수 있다. 다음의 질의문을 실행하면, 계층 관계를 가지는 데이터 전체와 각 행의 레벨이 출력된다.

SELECT ID, ParentID, ..., Level

    FROM tree_table

    START WITH ParentID IS NULL

    CONNECT BY ParentID=PRIOR ID

루프로 인한 오류를 발생시키지 않으려면 다음과 같이 NOCYCLE을 명시할 수 있다.

SELECT ID, ParentID, ..., Level

    FROM tree_table

    START WITH ParentID IS NULL

    CONNECT BY NOCYCLE ParentID=PRIOR ID