MERGE문 질문 있습니다! 0 6 949

by 천만달러 [Tibero] [2021.09.01 13:29:43]


<update id="saveGroupCompany" parameterType="hashmap">
        MERGE INTO HMG.TB_FOOTER_GROUP A 
        USING(
        <foreach collection="list" item="item" index="index" separator="UNION" >
            SELECT
                #{item.groupId, jdbcType=NUMERIC} as groupId
                ,#{item.langCd} as langCd
                ,#{item.groupNm} as groupNm
                ,#{item.groupLink} as groupLink
                ,#{item.sortNo} as sortNo
                ,#{__param.userId} as userId
            FROM DUAL
        </foreach>
        ) B
        ON (A.GROUP_ID = B.groupId)
        WHEN MATCHED THEN
            UPDATE SET
                A.LANG_CD     = B.langCd
                , A.GROUP_NM    = B.groupNm
                , A.GROUP_LINK  = B.groupLink
                , A.SORT_NO     = B.sortNo
                , A.CREATE_USER = B.userId
                , A.CREATE_DATE = CURRENT_TIMESTAMP
                , A.UPDATE_USER = B.userId
                , A.UPDATE_DATE = CURRENT_TIMESTAMP
        WHEN NOT MATCHED THEN
        INSERT (
            GROUP_ID
            , LANG_CD
            , GROUP_NM
            , GROUP_LINK
            , SORT_NO
            , CREATE_USER
            , CREATE_DATE
            , UPDATE_USER
            , UPDATE_DATE
        ) VALUES (
            HMG.SEQ_FOOTER_GROUP.NEXTVAL
            , B.langCd
            , B.groupNm
            , B.groupLink
            , B.sortNo
            , B.userId
            , CURRENT_TIMESTAMP
            , B.userId
            , CURRENT_TIMESTAMP
        )
    </update>

 

이 쿼리대로 했을때 추가로 글을 등록하면

모든 데이터의 날짜가 마지막으로 등록한 날짜로 일괄 변경되는데

뭐가 문제일까요...도와주세요 ㅠ

by 마농 [2021.09.01 14:02:16]

UPDATE 구문에서 CREATE_USER, CREATE_DATE 는 빼야죠.


by 천만달러 [2021.09.01 14:36:59]

A.UPDATE_USER = B.userId
A.UPDATE_DATE = CURRENT_TIMESTAMP

CREATE 빼도 아무것도 변화가 없길래 위 두 코드를 지웠더니

새로 등록할때는 새로 등록한 날짜만 변경되는걸로 고쳐졌는데...

수정할때 날짜가 안변합니다...UPDATE_DATE를 뺏으니 당연한건가 ㅠㅠ

다시 넣으면 날짜가 일괄 변경되고 ㅠㅠ

뭔가 방법이 없을까요...


by 마농 [2021.09.01 14:46:18]

"일괄변경"이 되었다는게 뭔가요?
어떻게 확인하셨나요?


by 마농 [2021.09.01 14:48:55]

USING 절 안에 들어 오는 값들이 뭔가요?
혹시 리스트 형태로 여러개의 값이 들어 오나요?
혹시 이 리스트가 기존 테이블 전체 내역 그대로 인것은 아닌지?


by 천만달러 [2021.09.01 14:57:05]

일단 CREATE_USER, CREATE_DATE 이 두 코드는 뺏습니다 ㅎ;;

 

추가버튼 누르면 테이블에 빈칸으로 입력할 수 있는 input 태그들이 생겨서

입력 후 저장해서 보는 그런 게시판인데

등록 하거나 수정하면 기존에 있던 데이터에 UPDATE_DATE가 모두 마지막으로 등록한 시간으로

변경되서 추가로 등록하거나 수정한 부분만 변경되게끔 하고 싶어서요

 


by 마농 [2021.09.01 15:01:08]

USING 절 안에 화면에 뿌려졌던 모든 리스트가 들어오는 것으로 추측 됩니다.
모든 행이 Update 되겠네요.
수정된 건만 리스트에 포함시켜야 합니다.
1안) 어플리케이션 단계에서 수정 건만 리스트에 포함시킬 수 있는 방안이 있는지 검토해 보세요.
2안) 머지문에서 조건절 추가하는 방안
1안) 을 추천합니다.
2안) 은 비효율

-- 2안)
MERGE INTO hmg.tb_footer_group a
USING (
...
) b
ON (a.group_id = b.groupid)
WHEN MATCHED THEN
UPDATE
   SET a.lang_cd     = b.langcd
     , a.group_nm    = b.groupnm
     , a.group_link  = b.grouplink
     , a.sort_no     = b.sortno
--     , a.create_user = b.userid
--     , a.create_date = current_timestamp
     , a.update_user = b.userid
     , a.update_date = current_timestamp
 WHERE a.lang_cd    != b.langcd
    OR a.group_nm   != b.groupnm
    OR a.group_link != b.grouplink
    OR a.sort_no    != b.sortno
WHEN NOT MATCHED THEN
INSERT ( group_id
       , lang_cd
       , group_nm
       , group_link
       , sort_no
       , create_user
       , create_date
--       , update_user
--       , update_date
       )
VALUES ( hmg.seq_footer_group.nextval
       , b.langcd
       , b.groupnm
       , b.grouplink
       , b.sortno
       , b.userid
       , current_timestamp
--       , b.userid
--       , current_timestamp
       )
;

 

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