WITH t AS ( SELECT 'A1' c1, 'B1' c2 FROM dual UNION ALL SELECT 'A2', 'B1' FROM dual UNION ALL SELECT 'A2', 'B2' FROM dual UNION ALL SELECT 'A2', 'B3' FROM dual UNION ALL SELECT 'A2', 'B5' FROM dual UNION ALL SELECT 'A3', 'B5' FROM dual UNION ALL SELECT 'A3', 'B7' FROM dual UNION ALL SELECT 'A4', 'B8' FROM dual UNION ALL SELECT 'A4', 'B9' FROM dual UNION ALL SELECT 'A5', 'B7' FROM dual UNION ALL SELECT 'A6', 'B8' FROM dual ) SELECT DISTINCT c1, c2 FROM t START WITH c2 = 'B5' CONNECT BY NOCYCLE PRIOR c1 = c1 OR PRIOR c2 = c2 ORDER BY c1, c2 ;
감사합니다ㅎ 저도 이거까진 해 봤는데.. 데이터 뻥튀기가 너무 많이 되더라구요.
원리는 잘 모르겠는데 c1, c2 끼리 같은 데이터가 많을수록 기하급수적으로 늘어나는 것 같아서... 혹 다른 방법 없을까 문의 드려봤습니다.
실 데이터는 1000~1500 건 정도 건수인 집합을 가지고 처리 합니다.
SELECT DISTINCT c1, c2
FROM t
START WITH c2 = 'B5'
CONNECT BY NOCYCLE (MOD(LEVEL, 2) = 0 AND PRIOR c1 = c1)
OR (MOD(LEVEL, 2) = 1 AND PRIOR c2 = c2)
ORDER BY c1, c2
;
감사합니다. 이건 이것저것 해보는 정도로는 이해가 잘 안되는 방법이네요. 좀 더 혼자 살펴보고 모르겠으면 다시 여쭤보겠습니다.
기존 쿼리는 홀짝 레벨 구분 없이 c1, c2 모두 찾았음.
쓸데 없이 많이 찾는 비효율 발생
개선 쿼리는 홀짝 레벨에 따라 찾는 방법을 달리 한 것입니다.
- 짝수 레벨에서는 c1 이 같은 걸 찾고
- 홀수 레벨에서는 c2 가 같은 걸 찾는