개발/SQL

[SQL] - MERGE INTO

dongdev 2022. 3. 5. 17:31

데이터가 없으면 insert 있으면 update

 

oracle, mybatis

--쿼리 대상 [TABLE/VIEW]
MERGE INTO [TABLE/VIEW]
 --비교대상 [TABLE/VIEW], DUAL은 테이블이 동일 할때 사용
 USING [TABLE/VIEW/DUAL] ON
 (
  --조건에 사용한 COLUMN은 UPDATE 불가
  [조건]
 )
 --조건 일치 시 UPDATE
 WHEN MATCHED THEN
  UPDATE SET
   [COLUMN1] = [VALUE1],
   [COLUMN2] = [VALUE2],
   [COLUMN3] = [VALUE3]
   ...
   
   --UPDATE후 DELETE 사용 가능(DELETE 단독 사용 안됨)
   [DELETE WHERE[COLUMN1]=[VALUE1]]
  
 --조건 불일치 시 INSERT
 WHEN NOT MATCHED THEN
  INSERT
  (
    [COLUMN1],
    [COLUMN2],
    [COLUMN3],
    ...
   )
   VALUES
   (
    [VALUE1],
    [VALUE2],
    [VALUE3],
    ...
   )

 

 

ex)

<update id="ex" parameterType="java.util.List">
 BEGIN
 <foreach collection="list" item="item" separator="">
 MERGE INTO GRADES AS G
  USING DUAL ON
  (
   G.STUDENT_ID = #{item.studentId}
   AND G.DATE = #{item.date}
  )
  WHEN MATCHED THEN
   UPDATE SET
    GRADES = #{item.grades},
    UPD_ID = #{item.id},
    UPD_DTM = SYSTIMESTAMP
  WHEN NOT MATCHED THEN
   INSERT 
   (
    STUDENT_ID,
    GRADES,
    DATE,
    RGST_ID,
    RGST_DTM,
    UPD_ID,
    UPD_DTM
   )
   VALUES
   (
    #{item.sudentId},
    #{item.grades},
    #{item.date},
    #{item.rgstId},
    #{item.rgstDtm},
    #{item.updId}
    #{item.updDtm}
   )
 </foreach>
 END
</update>