<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>
이 쿼리대로 했을때 추가로 글을 등록하면
모든 데이터의 날짜가 마지막으로 등록한 날짜로 일괄 변경되는데
뭐가 문제일까요...도와주세요 ㅠ
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 ) ;