각 합집합 구하는 쿼리 질문 0 2 1,314

by 아이뻐 [2013.01.17 15:14:09]



안녕하세요
좀 전에 질문 했던 문제 였습니다.
select 'A' Id, 111 site_id from dual union all
select 'B' Id, 111 site_id from dual union all
select 'C' Id, 111 site_id from dual union all
select 'D' Id, 111 site_id from dual union all
select 'E' Id, 111 site_id from dual union all
select 'B' Id, 222 site_id from dual union all
select 'C' Id, 222 site_id from dual union all
select 'D' Id, 222 site_id from dual union all
select 'T' Id, 222 site_id from dual union all
select 'A' Id, 333 site_id from dual union all
select 'B' Id, 333 site_id from dual union all
select 'C' Id, 333 site_id from dual union all
select 'U' Id, 333 site_id from dual union all
select 'A' Id, 444 site_id from dual union all
select 'B' Id, 444 site_id from dual union all
select 'C' Id, 444 site_id from dual union all
select 'D' Id, 444 site_id from dual union all
select 'E' Id, 444 site_id from dual union all
select 'F' Id, 444 site_id from dual union all
select 'G' Id, 444 site_id from dual
그런데 이번에는 아까와 다르게 교집합이 아닌 합집합을 구하려고 합니다.
EX)
id,  site_id
A    111+222
B    111+222
C    111+222
    D    111+222
    E    111+222
    T 111+222
    A    111+333
    B 111+333
    C 111+333
    D 111+333
    E    111+333 
U    111+333
    .   .
    .   .
    .   .
입니다.
결과로 보면 (111 U 222), (111 U 333), (111 U 444), (222 U 333), (222 U 444), (333 U 444) 입니다.
이것 또한 각 집합마다 UNION으로 묶으면 가능하지만 그러면 6번의 UNION을 사용해야 됩니다.
좀전 질문의 답변처럼 생각을 얻어 구해보려고 하지만 너무 생각이 안나네요~ 다시한번 여러분들의 조언을 빌려 보겠습니다.
짧은 시간에 많은 질문을 드려 죄송합니다.
by 마농 [2013.01.17 15:50:33]
SELECT DISTINCT a.id
     , LEAST(a.site_id, b.site_id)
       ||'+'||
       GREATEST(a.site_id, b.site_id) site_id
  FROM t a
     , t b
 WHERE a.site_id != b.site_id
 ORDER BY site_id, id
;

by 아이뻐 [2013.01.17 16:11:36]

답변 감사합니다.
어떻게 생각하면 간단한데 그 간단한 이치를 찾는게 너무 힘드네요~
쿼리 잘 사용하겟습니다.

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