database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 35547 게시물 읽기
No. 35547
하나의 행을 여러행으로 변경
작성자
김명근(ulary)
작성일
2009-04-15 10:32ⓒ
2009-04-15 10:35ⓜ
조회수
4,251

하나의 행을 여러행으로 분리 해서 처리 하고자 합니다.


SELECT * FROM A;

구분키  금액1  금액2  금액3   금액4  금액5

---------------------------------------

111      1100    1200    1300    1400    1400

.

.

.

이런 형태의 자료를


SELECT * FROM B;

구분키   금액구분    금액

------------------------

111        01             1100

111        02             1200

111        03             1300

111        04             1400

111        05             1500


이런 형태로 변경 할려고 합니다.

일반적으로 UNION을 사용한다면


INSERT INTO B

SELECT 구분키, '01', 금액1 FROM A

UNION ALL

SELECT 구분키, '02', 금액2 FROM A

UNION ALL

SELECT 구분키, '03', 금액3 FROM A

UNION ALL

SELECT 구분키, '04', 금액4 FROM A

UNION ALL

SELECT 구분키, '05', 금액5 FROM A

;

이런 유형의 SQL문이 되는데 문제는 테이블 A는 대용량 테이블이며 많은 조건이 있습니다.

대략 한번 처리시 200만건 정도의 자료를 처리 해야 합니다. 

해서 UNION을 사용 한다면 똑같은 테이블을 같은 조건으로 컬럼 갯수 만큼  SELECT한다는 부담이 있습니다.

실제 테이블의 처리해야할 컬럼 갯수는 30개 정도 됩니다.


UNION 을 사용하지 않고 한번 SELECT하여 여러 행을 한번에 INSERT할 수 있는 방법이 있을까요?

여러 고수님들의조언 바랍니다.


이 글에 대한 댓글이 총 3건 있습니다.
WITH AA AS
        (
        SELECT 111 X, 1100 A1, 1200 A2, 1300 A3 FROM DUAL
        UNION ALL
        SELECT 222 X, 2100 A1, 2200 A2, 2300 A3 FROM DUAL
        UNION ALL
        SELECT 333 X, 3100 A1, 3200 A2, 3300 A3 FROM DUAL
        )
SELECT x, trim(to_char(ROW_NUMBER() over (partition by x order by x),'00')) z, y
  FROM (
       SELECT X, Y
         FROM (
              SELECT X,
                     LTRIM(REGEXP_SUBSTR(';'||A1||';'||A2||';'||A3,';[^;]+',1,LEVEL),';') Y
                FROM AA
             CONNECT BY LEVEL <= (LENGTH(';'||A1||';'||A2||';'||A3) -
                                LENGTH(REPLACE(';'||A1||';'||A2||';'||A3,';')))/LENGTH(';')
              )
        GROUP BY X, Y
        ORDER BY X, Y
       ) 

이렇게 하면....
댓돌님이 2009-04-15 12:15에 작성한 댓글입니다.
이 댓글은 2009-04-15 14:06에 마지막으로 수정되었습니다. Edit

댓돌님의 방법대로 하였으나 WHERE문에 조건이 들어가게 되면서 속도가 나오지 않았습니다.

CONNECT BY 부분에 정의 때문인것 같았습니다.

저도 나름 고민하다 한가지 방법을 찾았습니다.


SELECT 구분키, 금액구분, 금액

(

SELECT 구분키

           ,CASE WHEN ROW_NUM = 1  THEN '01'

                  WHEN ROW_NUM = 2  THEN '02'

                  WHEN ROW_NUM = 3  THEN '03'

                  WHEN ROW_NUM = 4  THEN '04'

                  WHEN ROW_NUM = 5  THEN '05'

                  ELSE '' END   AS 금액구분

           ,CASE WHEN ROW_NUM = 1  THEN 금액1

                  WHEN ROW_NUM = 2  THEN 금액2

                  WHEN ROW_NUM = 3  THEN 금액3

                  WHEN ROW_NUM = 4  THEN 금액4

                  WHEN ROW_NUM = 5  THEN 금액5

                  ELSE '' END   AS 금액

FROM (

      SELECT A.구분키

                  ,ROW_NUMBER() OVER (PARTITION BY A.구분키 ORDER BY A.구분키) AS ROW_NUM

                  ,A.금액1

                  ,A.금액2

                  ,A.금액3

                  ,A.금액4

                  ,A.금액5

      FROM A, (SELECT ROWNUM NO_ROW FROM DUAL CONNECT BY LEVEL <= 5) B

       ) A

)

WHERE 금액 <> 0

ORDER BY 구분키, 금액구분

;



김명근(ulary)님이 2009-04-15 14:07에 작성한 댓글입니다.
SELECT 구분키
     , 금액구분
     , DECODE(금액구분,'01',금액1
                      ,'02',금액2
                      ,'03',금액3
                      ,'04',금액4
                      ,'05',금액5
              ) AS 금액
  FROM a
     , (SELECT LPAD(LEVEL,2,'0') 금액구분 FROM dual CONNECT BY LEVEL <= 5)
;

조회용이 아니라 입력용이라면 굳이 정렬하실 필요가 없습니다.
또한 굳이 한번에 입력처리해야할 상황이 아니라면 30번에 나누어서 입력하셔도 될듯합니다.
마농(manon94)님이 2009-04-15 15:10에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
35550오라클 필드명 대문자 관련 [5]
전정주
2009-04-16
8948
35549Oracle9i 설치시 에러.. 도와주세요 ㅜㅜ; [2]
정영근
2009-04-16
2617
35548프로시져를 이용하여 레코드셋을 만드는 방법? [2]
꼬마파랑
2009-04-15
4632
35547하나의 행을 여러행으로 변경 [3]
김명근
2009-04-15
4251
35546RMAN에서 컨트롤 파일 자동백업에 대하여.....
윤철민
2009-04-15
2645
35545RMAN으로 백업하는데 아카이브 파일에 대하여...
윤철민
2009-04-15
2946
35544ORA-01733: 가상 열은 사용할 수 없습니다 [4]
다반향초
2009-04-14
18961
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다