특정 로우 복제 관련 질문 0 3 934

by 지송요 [SQL Query] [2013.11.19 17:10:49]



안녕하십니까. 작업 중에 막히는 쿼리가 있어 염치 불구 하고 질문 드립니다.

select 401 id1, null id2, 100 value1 from dual union all
select 102 , 403, 200  from dual union all
select 301 , 103, 300  from dual union all
select null , 103, 400  from dual union all
select null , 103, 500  from dual

위의 데이를 가지고 아래와 같은 데이터를 만들고자 합니다.
--결과
select 401 id, 100 value1 from dual union all
select 102 , 200  from dual union all
select 403, 200  from dual union all
select 301 , 300  from dual union all
select 103, 300  from dual union all
select 103, 400  from dual union all
select 103, 500  from dual

결과를 보시면 id1,id2는 id라는 컬럼 하나로 통합되며 
id1,2 둘 다 값이 있을시에는 각자의 id를 가지면서 데이터 복제를 합니다.
결과 처럼 보여 주고 싶은데 어떻게 해야하는지 도움을 주셨으면 감사하겠습니다.
by 우리집아찌 [2013.11.19 17:37:44]
-- union all 사용 
WITH T AS (
select 401 id1, null id2, 100 value1 from dual union all
select 102 , 403, 200 from dual union all
select 301 , 103, 300 from dual union all
select null , 103, 400 from dual union all
select null , 103, 500 from dual 
)

SELECT ID1 , VALUE1 FROM T WHERE ID1 IS NOT NULL
UNION ALL
SELECT ID2 , VALUE1 FROM T WHERE ID2 IS NOT NULL
ORDER BY VALUE1

by 지송요 [2013.11.19 17:45:56]
감사합니다. 막상 답변을 보면 왜 이렇게 생각 못했을까 한탄을 합니다.ㅠㅠ
귀중한 시간 내어주셔서 고맙습니다..

by 우리집아찌 [2013.11.19 17:41:11]
-- CROSS JOIN 사용 
WITH T AS ( 
select 401 id1, null id2, 100 value1 from dual union all
select 102 , 403, 200 from dual union all
select 301 , 103, 300 from dual union all
select null , 103, 400 from dual union all
select null , 103, 500 from dual 
) 
 
SELECT DECODE(LV ,1,ID1,2,ID2) ID , VALUE1 
 FROM T , (SELECT LEVEL LV FROM DUAL CONNECT BY LEVEL <= 2 )
 WHERE DECODE(LV ,1,ID1,2,ID2) IS NOT NULL
 ORDER BY 2 
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입