하루종일 머리 싸매고 고민중인데 도통 해결이 안되어 질문 드립니다.
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 |
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) ;