Open Source RDBMS - Seamless, Scalable, Stable and Free

한국어 | Login |Register

Versions available for this page: CUBRID 8.4.3 |  CUBRID 9.0.0 | 

계층 질의문에서 사용 가능한 의사 칼럼

LEVEL

LEVEL은 계층 질의 결과 행의 깊이 레벨(depth)을 나타내는 의사 칼럼(pseudocolumn)이다. 루트 노드의 LEVEL은 1이며, 하위 자식 노드의 LEVEL은 2가 된다.

LEVEL 의사 칼럼은 SELECT 문 내의 WHERE 절, ORDER BY 절, GROUP BY ... HAVING 절, CONNECT BY 절에서 사용 가능하며, 집계 함수를 이용하는 구문에서도 사용 가능하다.

다음은 노드의 레벨을 확인하기 위하여 LEVEL 값을 조회하는 예제이다.

-- LEVEL의 값을 확인하기

SELECT id, mgrid, name, LEVEL

    FROM tree

    WHERE LEVEL=2

    START WITH mgrid IS NULL

    CONNECT BY PRIOR id=mgrid

    ORDER BY id;

 

id  mgrid       name        level

=========================================

3   1       Jonas       2

4   1       Smith       2

5   2       Verma       2

6   2       Foster      2

다음은 CONNECT BY 절 뒤에 LEVEL 조건을 추가한 예제이다.

SELECT LEVEL FROM db_root CONNECT BY LEVEL <= 10;

 

        level

=============

            1

            2

            3

            4

            5

            6

            7

            8

            9

           10

단, "CONNECT BY expr(LEVEL) < expr"과 같은 형태, 예를 들어 "CONNECT BY LEVEL +1 < 5"와 같은 형태는 지원하지 않는다.

CONNECT_BY_ISLEAF

CONNECT_BY_ISLEAF는 계층 질의 결과 행이 리프 노드(leaf node : 하위에 자식 노드를 가지지 않는 단말 노드)인지 가리키는 의사 칼럼이다. 계층 구조 하에서 현재 행이 리프 노드이면 1을 반환하고, 그렇지 않으면 0을 반환한다.

다음은 리프 노드를 확인하기 위하여 CONNECT_BY_ISLEAF 값을 조회하는 예제이다.

-- CONNECT_BY_ISLEAF의 값을 확인하기

SELECT id, mgrid, name, CONNECT_BY_ISLEAF

    FROM tree

    START WITH mgrid IS NULL

    CONNECT BY PRIOR id=mgrid

    ORDER BY id;

 

id  mgrid       name        connect_by_isleaf

===========================================================

1   null        Kim     0

2   null        Moy     0

3   1       Jonas       1

4   1       Smith       1

5   2       Verma       1

6   2       Foster      0

7   6       Brown       1

CONNECT_BY_ISCYCLE

CONNECT_BY_ISCYCLE은 계층 질의 결과 행이 루프를 발생시키는 행인지를 가리키는 의사 칼럼이다. 즉, 현재 행의 자식이 동시에 조상이 되어 루프를 발생시키는 경우 1을 반환하고, 그렇지 않으면 0을 반환한다.

CONNECT_BY_ISCYCLE 의사 칼럼은 SELECT 문 내의 WHERE 절, ORDER BY 절, GROUP BY ... HAVING 절에서 사용할 수 있으며, 집계 함수를 이용하는 구문에서도 사용 가능하다.

참고 CONNECT_BY_ISCYCLECONNECT BY 절에 NOCYCLE 키워드가 명시되는 경우에만 사용할 수 있다.

다음은 루프를 발생시키는 행을 확인하기 위해 CONNECT_BY_ISCYCE 값을 조회하는 예제이다.

-- tree_cycle 테이블을 만들고 데이터를 삽입하기

CREATE TABLE tree_cycle(ID INT, MgrID INT, Name VARCHAR(32));

 

INSERT INTO tree_cycle VALUES (1,NULL,'Kim');

INSERT INTO tree_cycle VALUES (2,11,'Moy');

INSERT INTO tree_cycle VALUES (3,1,'Jonas');

INSERT INTO tree_cycle VALUES (4,1,'Smith');

INSERT INTO tree_cycle VALUES (5,3,'Verma');

INSERT INTO tree_cycle VALUES (6,3,'Foster');

INSERT INTO tree_cycle VALUES (7,4,'Brown');

INSERT INTO tree_cycle VALUES (8,4,'Lin');

INSERT INTO tree_cycle VALUES (9,2,'Edwin');

INSERT INTO tree_cycle VALUES (10,9,'Audrey');

INSERT INTO tree_cycle VALUES (11,10,'Stone');

 

-- CONNECT_BY_ISCYCLE의 값을 확인하기

SELECT id, mgrid, name, CONNECT_BY_ISCYCLE

    FROM tree_cycle

    START WITH name in ('Kim', 'Moy')

    CONNECT BY NOCYCLE PRIOR id=mgrid

    ORDER BY id;

 

id  mgrid       name        connect_by_iscycle

==========================================================

1   null        Kim     0

2   11      Moy     0

3   1       Jonas       0

4   1       Smith       0

5   3       Verma       0

6   3       Foster      0

7   4       Brown       0

8   4       Lin     0

9   2       Edwin       0

10  9       Audrey      0

11  10      Stone       1