Oracle/SQL2012. 5. 11. 11:16

순차적으로 계산되는 데이터의 계산 순서를 조회해보자.

 

예제를 위해 아래와 같이 데이터를 생성하자. 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
Posted by 정희락_