순차적으로 계산되는 데이터의 계산 순서를 조회해보자.
예제를 위해 아래와 같이 데이터를 생성하자. A 계정을 계산하기 위해서는 B, C, D, E 계정이 필요하고, E 계정 계산하기 위해서는 B 계정과 C 계정이 필요하다.
-- 1 DROP TABLE t1 PURGE; CREATE TABLE t1 ( cd VARCHAR2(1), -- 계정 c1 VARCHAR2(1), -- 계산계정1 c2 VARCHAR2(1), -- 계산계정2 c3 VARCHAR2(1), -- 계산계정3 c4 VARCHAR2(1) -- 계산계정4 ); INSERT INTO t1 VALUES ('A', 'B', 'C' , 'D' , 'E' ); INSERT INTO t1 VALUES ('B', 'F', 'G' , 'H' , NULL); INSERT INTO t1 VALUES ('C', 'I', 'J' , NULL, NULL); INSERT INTO t1 VALUES ('D', 'K', NULL, NULL, NULL); INSERT INTO t1 VALUES ('E', 'B', 'C' , NULL, NULL); INSERT INTO t1 VALUES ('F', 'C', 'D' , NULL, NULL); COMMIT;
아래와 같이 계층 쿼리를 사용하면 데이터 생성 순서를 구할 수 있다. A 계정은 5번째로 계산되어야 한다.
-- 2 SELECT cd, MAX (LEVEL) AS lv FROM t1 CONNECT BY PRIOR cd IN (c1, c2, c3, c4) GROUP BY cd ORDER BY 2, 1; C1 LV -- -- C 1 D 1 F 2 B 3 E 4 A 5 6 행이 선택되었습니다.
[2018-03-06]
아래와 같이 자식 노드가 없는 노드로 루트 노드를 생성하면 불필요한 전개를 줄일 수 있다.
-- 3 SELECT a.cd, MAX (LEVEL) AS lv FROM t1 a START WITH NOT EXISTS (SELECT 1 FROM t1 x WHERE x.cd IN (a.c1, a.c2, a.c3, a.c4)) CONNECT BY PRIOR a.cd IN (a.c1, a.c2, a.c3, a.c4) GROUP BY a.cd ORDER BY 2 , 1; C1 LV -- -- C 1 D 1 F 2 B 3 E 4 A 5 6 행이 선택되었습니다.
'Oracle > SQL' 카테고리의 다른 글
SQL ID 생성 (0) | 2013.09.24 |
---|---|
최종 거래일이 1달 남은 ELW 만기일 조회 (0) | 2012.07.12 |
주별 집계 (0) | 2012.05.09 |
주민등록번호 마스킹 (0) | 2012.04.30 |
다중 행을 문자열로 집계 (0) | 2012.04.16 |