같은 테이블 조인한 결과에서... 0 4 4,503

by 미르 [SQLServer] [2012.08.08 10:04:22]


select
    *
from Table as A
    inner join Table as B on A.name = B.name
where A.key <> B.key
and A.start <= B.end 
and A.end >= B.start

위와 같이 하나의 테이블을 조인하여 기간이 중복되는 정보만 출력하고 싶습니다.

헌데, 위와 같이 하면 A, B 그리고 B, A와 같은 위치만 바뀐 2개의  row가 생성 되게 되는데 이를 하나로 줄일 수 있는 방법이 없을까요?


예시)
--------------------------------------------------------------------------- 
name    key    start    end    data
홍길동    1    120101    120201    'abc'
홍길동     2    120120    120308    '가나다'
--------------------------------------------------------------------------- 

와 같은 데이터일 때, 2개의 row가 아닌 1개의 row

--------------------------------------------------------------------------- 
name    A.start    A.end    A.data     B.start    B.end    B.data
홍길동    120101    120201    'abc' 120120    120308    '가나다'
--------------------------------------------------------------------------- 

위와 같은 데이터를 얻고 싶습니다. A와 B의 순서는 무관합니다

조언 부탁드려요 ^^;;
by 마농 [2012.08.08 11:38:27]

- 변경전 : where A.key B.key
- 변경후 : where A.key <  B.key


by ZeTT [2012.08.08 12:43:57]
 WITH T AS(
SELECT '홍길동' NAME, '1' KEY, '120101' START_DATE, '120101' END_DATE, 'ABC' DATA FROM DUAL UNION ALL
SELECT '홍길동' NAME, '2' KEY, '120120' START_DATE, '120120' END_DATE, '가나다' DATA FROM DUAL UNION ALL
SELECT '홍길동' NAME, '3' KEY, '120220' START_DATE, '120220' END_DATE, '123' DATA FROM DUAL UNION ALL
SELECT '홍길동' NAME, '4' KEY, '120101' START_DATE, '120130' END_DATE, '456' DATA FROM DUAL UNION ALL
SELECT '임꺽정' NAME, '5' KEY, '120220' START_DATE, '120225' END_DATE, '라마바' DATA FROM DUAL UNION ALL
SELECT '임꺽정' NAME, '6' KEY, '120120' START_DATE, '120420' END_DATE, '789' DATA FROM DUAL
)
SELECT A.NAME
,A.KEY
,A.START_DATE
,A.END_DATE
,A.DATA
,B.KEY
,B.START_DATE
,B.END_DATE
FROM T A
JOIN T B ON A.NAME = B.NAME
AND A.KEY  B.KEY
WHERE 1=1
AND( 
A.START_DATE BETWEEN B.START_DATE AND B.END_DATE
OR A.END_DATE BETWEEN B.START_DATE AND B.END_DATE
)
GROUP BY A.NAME
,A.KEY
,A.START_DATE
,A.END_DATE
,A.DATA
,B.KEY
,B.START_DATE
,B.END_DATE
ORDER BY A.KEY

by ZeTT [2012.08.08 12:44:58]

SQL초보가 쓴거라...이렇게쓰는게 맞는지 모르겠네요 -ㅁ-;;


by 미르 [2012.08.08 12:55:02]
와우! 마농님!! 짱입니다 !! ㅋㅋㅋ 엄청 간단하게 해결되네요!
생각지도 못했는데! ㅋ 감사합니다!

ZeTT님도 감사합니다 ㅋ 근데 group by 해서하면 그대로 다시 나오게 되요 ㅠ 

답변달아주신 두분 모두 감사합니다~!
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입