SQL 문의드립니다. 0 5 1,409

by 임상준 [SQL Query] [2018.06.22 16:18:08]


안녕하세요?

 

아래와 같은 데이터가 있을 때 (C1, C2 는 컬럼 이름입니다)

C2 = 'B5' 인 조건부터 시작해서 엮여있는 모든 데이터 셋(노란색) 을 구하는 방법이 있을까요?

B5 는 A2, A3 에 연결 되어 있고 다시 A3은 B7, A2 는 B3/2/1 에 연결 되어 있고.. 이런식으로 엮여있는 모든 데이터를 찾고 싶습니다.

답변 미리 감사드립니다^^

C1 C2
A1 B1
A2 B1
A2 B2
A2 B3
A2 B5
A3 B5
A3 B7
A4 B8
A4 B9
A5 B7
A6 B8
by 마농 [2018.06.22 16:51:00]
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
;

 


by 임상준 [2018.06.22 16:57:46]

감사합니다ㅎ 저도 이거까진 해 봤는데.. 데이터 뻥튀기가 너무 많이 되더라구요.

원리는 잘 모르겠는데 c1, c2 끼리 같은 데이터가 많을수록 기하급수적으로 늘어나는 것 같아서... 혹 다른 방법 없을까 문의 드려봤습니다.

실 데이터는 1000~1500 건 정도 건수인 집합을 가지고 처리 합니다.


by 마농 [2018.06.25 13:33:16]
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
;

 


by 임상준 [2018.06.27 17:08:02]

감사합니다. 이건 이것저것 해보는 정도로는 이해가 잘 안되는 방법이네요. 좀 더 혼자 살펴보고 모르겠으면 다시 여쭤보겠습니다.


by 마농 [2018.06.27 17:18:04]

기존 쿼리는 홀짝 레벨 구분 없이 c1, c2 모두 찾았음.
쓸데 없이 많이 찾는 비효율 발생
개선 쿼리는 홀짝 레벨에 따라 찾는 방법을 달리 한 것입니다.
- 짝수 레벨에서는 c1 이 같은 걸 찾고
- 홀수 레벨에서는 c2 가 같은 걸 찾는

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입