1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | WITH t( no , c1, c2, c3) AS ( -- 원본 테이블 -- SELECT 1, 'A' , 'B' , 'C' FROM dual UNION ALL SELECT 2, 'A' , 'S' , 'T' FROM dual UNION ALL SELECT 3, 'A' , 'C' , 'D' FROM dual UNION ALL SELECT 4, 'B' , 'C' , 'D' FROM dual UNION ALL SELECT 5, 'D' , 'E' , 'F' FROM dual UNION ALL SELECT 6, 'E' , 'G' , 'H' FROM dual UNION ALL SELECT 7, 'X' , 'Y' , 'Z' FROM dual UNION ALL SELECT 8, 'K' , 'A' , 'B' FROM dual UNION ALL SELECT 9, 'L' , 'M' , 'N' FROM dual UNION ALL SELECT 10, 'Q' , 'P' , 'R' FROM dual ) , t1 AS ( -- 계층 구조를 만들기 위한 집합 -- SELECT c, pc FROM ( SELECT c, pc , DENSE_RANK() OVER(PARTITION BY c ORDER BY NVL2(pc, 1, 2)) dr FROM ( SELECT no , c , LAG(c) OVER(PARTITION BY no ORDER BY c) pc FROM ( SELECT no , DECODE(lv, 1, c1, 2, c2, 3, c3) c FROM t , ( SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 3) ) ) GROUP BY c, pc ) WHERE dr = 1 ) -- 계층 구조 쿼리 -- SELECT DISTINCT CONNECT_BY_ROOT c rc , c FROM t1 START WITH pc IS NULL CONNECT BY PRIOR c = pc ORDER BY rc, c ; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | WITH t( no , c1, c2, c3) AS ( -- 원본 테이블 -- SELECT 1, 'A' , 'B' , 'C' UNION ALL SELECT 2, 'A' , 'S' , 'T' UNION ALL SELECT 3, 'A' , 'C' , 'D' UNION ALL SELECT 4, 'B' , 'C' , 'D' UNION ALL SELECT 5, 'D' , 'E' , 'F' UNION ALL SELECT 6, 'E' , 'G' , 'H' UNION ALL SELECT 7, 'X' , 'Y' , 'Z' UNION ALL SELECT 8, 'K' , 'A' , 'B' UNION ALL SELECT 9, 'L' , 'M' , 'N' UNION ALL SELECT 10, 'Q' , 'P' , 'R' ) , t1 AS ( -- 3개 행으로 복제 -- SELECT a. no , CASE b. no WHEN 1 THEN a.c1 WHEN 2 THEN a.c2 WHEN 3 THEN a.c3 END c FROM t a CROSS JOIN ( SELECT no FROM t WHERE no <= 3) b ) , t2 AS ( -- 계층 구조를 만들기 위한 집합 -- SELECT c, pc FROM ( SELECT a.c , b.c pc , DENSE_RANK() OVER(PARTITION BY a.c ORDER BY LEN(b.c) DESC ) dr FROM t1 a LEFT OUTER JOIN t1 b ON a. no = b. no AND a.c > b.c GROUP BY a.c, b.c ) a WHERE dr = 1 ) , t3 AS ( -- 재귀 호출 쿼리 -- SELECT c rc , c FROM t2 WHERE pc IS NULL UNION ALL SELECT a.rc, b.c FROM t3 a INNER JOIN t2 b ON a.c = b.pc ) SELECT DISTINCT rc, c FROM t3 ; |