[오라클] 고민하다가 질문 하나 드립니다. 0 5 1,113

by Ginam [SQL Query] [2014.07.14 19:19:57]


하루종일 머리 싸매고 고민중인데 도통 해결이 안되어 질문 드립니다.

TB_HMWRK 와 TB_HMWRK_HST 라는 테이블에서

TB_HMWRK의 데이터를 TB_HMWRK_HST 테이블에 복사하여 INSERT 하고자 합니다.

이 때, 동일한 ID의 데이터가 있으면, 기존의 데이터 중 시리얼 넘버가 최대값인 데이터의 DLT_CD를 '90000002'로 UPDATE하고,

시리얼넘버(10자리)를 최대값에 +1 하여 INSERT 하려고 합니다.

또한, 동일한 ID의 데이터가 없다면, 시리얼 넘버를 0000000001 로 INSERT 하려고 합니다.

열심히 찾던 와중에 MERGE INTO  를 찾았는데 이건 동일한 값이 있을 경우에 INSERT는 할 수 없고 UPDATE만 되네요. ㅠㅠ

아래 MERGE의 

WHEN MATCHED THEN
UPDATE SET HST.DLT_CD = '90000002'
WHERE HST.HMWRK_ID = '2514a9488512409fb6a6fc412df0feb1'


다음에 아래 INSERT 문의 내용이 실행되었으면 되는데, 이것을 하나의 SQL 로 만들 수는 없을런지요...?

 

염치 불구하고 도움 부탁드립니다. 

 

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

MERGE 문

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

MERGE INTO TB_HMWRK_HST HST
USING TB_HMWRK HMWRK
ON (HST.HMWRK_ID = HMWRK.HMWRK_ID)

WHEN MATCHED THEN
UPDATE SET HST.DLT_CD = '90000002'
WHERE HST.HMWRK_ID = '2514a9488512409fb6a6fc412df0feb1'

WHEN NOT MATCHED THEN
INSERT (HMWRK_ID, HMWRK_TTL, HMWRK_STRT_DT, HMWRK_END_DT, ATCH_FLE_CNT, RGST_DTT, HST_SRL_NUM, DLT_CD)
VALUES
(HMWRK.HMWRK_ID, HMWRK.HMWRK_TTL, HMWRK.HMWRK_STRT_DT, HMWRK.HMWRK_END_DT, HMWRK.ATCH_FLE_CNT, HMWRK.RGST_DTT, '0000000001', '90000001')
WHERE HMWRK.HMWRK_ID = '2514a9488512409fb6a6fc412df0feb1';

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

 

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

INSERT 문

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

INSERT INTO TB_HMWRK_HST(HMWRK_ID, HMWRK_TTL, HMWRK_STRT_DT, HMWRK_END_DT, ATCH_FLE_CNT, RGST_DTT, HST_SRL_NUM, DLT_CD)
SELECT HMWRK.HMWRK_ID, HMWRK.HMWRK_TTL, HMWRK.HMWRK_STRT_DT, HMWRK.HMWRK_END_DT, HMWRK.ATCH_FLE_CNT, HMWRK.RGST_DTT, 
LPAD((MAX(HST.HST_SRL_NUM)+1), 10, '0'), '90000001'
FROM TB_HMWRK HMWRK, TB_HMWRK_HST HST
WHERE HMWRK.HMWRK_ID = '2514a9488512409fb6a6fc412df0feb1'
GROUP BY HMWRK.HMWRK_ID, HMWRK.HMWRK_TTL, HMWRK.HMWRK_STRT_DT, HMWRK.HMWRK_END_DT, HMWRK.ATCH_FLE_CNT, HMWRK.RGST_DTT, '90000001';

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

 

 

TB_HMWRK

HMWRK_ID HMWRK_TTL HMWRK_STRT_DT HMWRK_END_DT ATCH_FLE_CNT RGST_DTT
HMWRK00001 NUMBER 14/06/27 14/07/05 0 14/07/14 15:14:00.629000000
HMWRK00002 SUM 14/07/05 14/07/08 0 14/07/14 15:14:00.632000000

 

HMWRK_ID HST_SRL_NUM HMWRK_TTL HMWRK_STRT_DT HMWRK_END_DT ATCH_FLE_CNT RGST_DTT DLT_CD
HMWRK00001 00000000001 NUMBER 14/06/27 14/07/05 0 14/07/14 15:14:00.629000000 90000002
HMWRK00001 00000000002 NUMBER 14/06/27 14/07/05 0 14/07/14 1:14:00.629000000 90000001

 

by 우리집아찌 [2014.07.14 19:32:23]

프로시져 사용해보세요..


by Ginam [2014.07.14 20:10:26]

흑흑.... ㅠㅠ


by 마농 [2014.07.15 09:22:05]
MERGE INTO tb_hmwrk_hst hst
USING
(
-- 1. Insert 대상 -- 
SELECT m.hmwrk_id, m.hmwrk_ttl, m.hmwrk_strt_dt, m.hmwrk_end_dt, m.atch_fle_cnt, m.rgst_dtt
     , LPAD(NVL(hst.hst_srl_num + 1, 1), 10, '0') hst_srl_num
     , hst.dlt_cd
  FROM tb_hmwrk m
     , tb_hmwrk_hst hst
 WHERE m.hmwrk_id = '2514a9488512409fb6a6fc412df0feb1'
   AND hst.hmwrk_id(+) = m.hmwrk_id
   AND hst.dlt_cd(+) = '90000001'
 UNION ALL
-- 2. Update 대상 -- 
SELECT m.hmwrk_id, m.hmwrk_ttl, m.hmwrk_strt_dt, m.hmwrk_end_dt, m.atch_fle_cnt, m.rgst_dtt
     , hst.hst_srl_num
     , '90000002' dlt_cd
  FROM tb_hmwrk m
     , tb_hmwrk_hst hst
 WHERE m.hmwrk_id = '2514a9488512409fb6a6fc412df0feb1'
   AND hst.hmwrk_id = m.hmwrk_id
   AND hst.dlt_cd = '90000001'
) m
ON (hst.hmwrk_id = m.hmwrk_id AND hst.hst_srl_num = m.hst_srl_num)
WHEN MATCHED THEN
UPDATE SET hst.dlt_cd = m.dlt_cd
WHEN NOT MATCHED THEN
INSERT (   hmwrk_id,   hmwrk_ttl,   hmwrk_strt_dt,   hmwrk_end_dt,   atch_fle_cnt,   rgst_dtt
       ,   hst_srl_num,   dlt_cd)
VALUES ( m.hmwrk_id, m.hmwrk_ttl, m.hmwrk_strt_dt, m.hmwrk_end_dt, m.atch_fle_cnt, m.rgst_dtt
       , m.hst_srl_num, m.dlt_cd)
;

 


by 우리집아찌 [2014.07.15 12:58:09]

생각못했던 방법이네요..

나중에 써먹어야지.. ㅎㅎ

 

 


by Ginam [2014.07.16 10:51:41]

답변 감사드립니다 ^_^

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