현상
참고
해당 현상은 Tibero 6 FS 07 버전에서 발생했습니다.
SYS_CONNECT_BY_PATH 함수 사용 시, 결과값이 타 DBMS와 다르게 출력되는 현상이 발생했습니다.
아래는 예제 데이터입니다.
CREATE TABLE tab1 (
id NUMBER,
parent_id NUMBER
);
INSERT INTO tab1 VALUES (1, NULL);
INSERT INTO tab1 VALUES (2, 1);
INSERT INTO tab1 VALUES (3, 2);
INSERT INTO tab1 VALUES (4, 2);
INSERT INTO tab1 VALUES (5, 4);
INSERT INTO tab1 VALUES (6, 4);
INSERT INTO tab1 VALUES (7, 1);
INSERT INTO tab1 VALUES (8, 7);
INSERT INTO tab1 VALUES (9, 1);
INSERT INTO tab1 VALUES (10, 9);
INSERT INTO tab1 VALUES (11, 10);
INSERT INTO tab1 VALUES (12, 9);
COMMIT;
SQL
복사
Tibero start with 사용하지 않았을 경우 full path
select id, parent_id,
(select 'L' || level || sys_connect_by_path (id, '⇢')
from tab1
where t1.id = tab1.id and rownum = 1
connect by prior id = parent_id) as full_path
from tab1 t1;
SQL
복사
ID PARENT_ID FULL_PATH
---------- ---------- -----------------
1 L1⇢1
2 1 L1⇢2
3 2 L1⇢3
4 2 L1⇢4
5 4 L1⇢5
6 4 L1⇢6
7 1 L1⇢7
8 7 L1⇢8
9 1 L1⇢9
10 9 L1⇢10
11 10 L1⇢11
12 9 L1⇢12
12 rows selected.
SQL
복사
Tibero start with 사용했을 경우 full path
select id, parent_id,
(select 'L' || level || sys_connect_by_path (id, '⇢')
from tab1
where t1.id = tab1.id and rownum = 1
start with parent_id is null
connect by prior id = parent_id) as full_path
from tab1 t1;
SQL
복사
ID PARENT_ID FULL_PATH
1 L1⇢1
2 1 L2⇢1⇢2
3 2 L3⇢1⇢2⇢3
4 2 L3⇢1⇢2⇢4
5 4 L4⇢1⇢2⇢4⇢5
6 4 L4⇢1⇢2⇢4⇢6
7 1 L2⇢1⇢7
8 7 L3⇢1⇢7⇢8
9 1 L2⇢1⇢9
10 9 L3⇢1⇢9⇢10
11 10 L4⇢1⇢9⇢10⇢11
12 9 L3⇢1⇢9⇢12
12 rows selected.
SQL
복사
START WITH절이 없는 경우, SYS_CONNECT_BY_PATH 함수 사용 시 full path를 정상적으로 출력하지 못하는 현상이 확인됩니다.
원인
CONNECT BY 구문에서 SYS_CONNECT_BY_PATH 함수를 사용하여 루트부터 자신까지의 경로 정보를 출력하려는 경우에 START WITH 절이 생략되면 full path가 정상적으로 출력되지 않습니다.
해결
CONNECT BY 구문에서는 START WITH 절이 생략될 경우 원하는 결과가 제대로 출력되지 않기 때문에, 루트로 사용될 row를 START WITH 절을 통해 명확히 지정해야 정상 동작이 가능합니다.
특히 SYS_CONNECT_BY_PATH 함수를 사용하는 경우에는 START WITH 절을 반드시 사용해야합니다.