안녕하세요.
뭔가 가능할것 같은데..영 안풀려서 문의드립니다.
간단히 짝꿍신청이라고 생각하시면 되고
신청한 사람끼리 짝꿍을 맺어줄려고 하는데요.
짝사랑은 안되고 서로서로 신청을 해야만 짝꿍이 됩니다.
A -> C
B -> C
C -> B
D -> E
E -> D
신청을 했다면
아래와 같이 추출 하고 싶습니다.
----------------------
짝꿍구분값 | ID | 성명
----------------------
1 | B | 가가가
1 | C | 나나나
2 | D | 다다다
2 | E | 라라라
WITH t AS ( SELECT '1111' no, '홍길동' kornm, '5555' mate_no, '김철수' mate_kornm FROM dual UNION ALL SELECT '2222', '이철수', '3333', '홍길남' FROM dual UNION ALL SELECT '4444', '홍길북', '1111', '박철수' FROM dual UNION ALL SELECT '3333', '홍길남', '2222', '이철수' FROM dual UNION ALL SELECT '5555', '김철수', '1111', '홍길동' FROM dual ) SELECT * from t --SELECT * from t a,t b --where a.no=b.mate_no ;
no 컬럼은 신청한 사람의 ID,
kornm 컬럼은 신청한 사람 성명,
mate_no 상대방의 ID,
mate_kornm 컬럼은 상대방의 성명입니다.
아래와 같이 추출 하고 싶습니다.
구분값 | no | 성명
1 1111 홍길동
1 5555 김철수
2 2222 이철수
2 3333 홍길남
저는 단순하게 조인해서 정렬을 해볼까 했는데..짝꿍끼리 연달아 나오지 않고 떨어져 나오니깐
짝궁인지 알아보기도 힘드네요 ㅎㅎㅎ
그래서 열을 행으로 바꾸면 될것 같기도 하고..
도움 부탁드립니다.
WITH t AS ( SELECT '1111' no, '홍길동' kornm, '5555' mate_no, '김철수' mate_kornm FROM dual UNION ALL SELECT '2222', '이철수', '3333', '홍길남' FROM dual UNION ALL SELECT '4444', '홍길북', '1111', '박철수' FROM dual UNION ALL SELECT '3333', '홍길남', '2222', '이철수' FROM dual UNION ALL SELECT '5555', '김철수', '1111', '홍길동' FROM dual ) SELECT NUM , DECODE(LV,1,NO1,2,NO2) N0 , DECODE(LV,1,NM1,2,NM2) NM FROM ( SELECT ROW_NUMBER() OVER(ORDER BY NULL) NUM ,GRP ,MAX(DECODE(RN,1,KORNM)) NM1 ,MAX(DECODE(RN,2,KORNM)) NM2 ,MAX(DECODE(RN,1,NO)) NO1 ,MAX(DECODE(RN,2,NO)) NO2 FROM ( SELECT A.NO , A.KORNM , LEAST( A.NO , B.NO ) AS GRP , ROW_NUMBER() OVER(PARTITION BY LEAST( A.NO , B.NO ) ORDER BY NULL ) RN FROM T A , T B WHERE A.NO = B.MATE_NO AND B.NO = A.MATE_NO ) GROUP BY GRP ) , (SELECT LEVEL LV FROM DUAL CONNECT BY LEVEL <=2 ) ORDER BY GRP , DECODE(LV,1,NO1,2,NO2)
-- 1. Self 조인 후 Dense_rank SELECT DENSE_RANK() OVER(ORDER BY LEAST(a.no, a.mate_no)) dr , a.no, a.kornm FROM t a , t b WHERE a.no = b.mate_no AND b.no = a.mate_no ORDER BY dr, no ; -- 2. 계층쿼리의 NoCycle 과 Connect_by_isCycle 기능 이용 SELECT DENSE_RANK() OVER(ORDER BY LEAST(no, mate_no)) dr , no, kornm FROM t WHERE CONNECT_BY_ISCYCLE = 1 CONNECT BY NOCYCLE PRIOR no = mate_no ORDER BY dr, no ;