본문 바로가기
DataBase

관계형데이터베이스(RDBMS)별Merge 정리

by 작심평생 2020. 3. 13.
Merge 문은 조건에 따라 INSERT / UPDATE || DELETE 를 할 수 있는 구문입니다.
MyBatis를 사용하는 경우 mapper.xml에 사용하는 태그도 다르니 참고하면 됩니다.
 
다른 블로그나, 티스토리 등 구글링을하면 기본적인 문법이 나와서
따로 정리하지는 않고, 대신 DB별로 자기 자신 테이블을 조회하는 문법을 정리하려고 합니다
 
보다 다양한 Merge문법은 아래 DB별 링크를 참고하면 됩니다.
 

 


 

DB2

( https://www.ibm.com/support/knowledgecenter/ko/SSEPGG_10.5.0/com.ibm.db2.luw.sql.ref.doc/doc/r0010873.html )

MyBatis : <update></update>
DAO.java : update
 
1
2
3
4
5
6
7
8
9
10
11
12
    MERGE INTO testTable -- 최종적으로 처리 결과 적용될 테이블
        USING (VALUES (1)) AS Source (Number) --비교 테이블이 자기 자신테이블
        ON ( -- 처리 결정 조건)
        
             WHEN MATCHED THEN
                    -- 쿼리 (insert || update || delete)
                    
             WHEN NOT MATCHED THEN
                    -- 쿼리 (insert || update || delete)
                    
             ELSE IGNORE -- 그외 무시
 
Colored by Color Scripter
 
 

Maria DB

( https://mariadb.com/kb/en/insert-on-duplicate-key-update/ )

MyBatis : <insert></insert>
DAO.java : insert
 
1
2
3
4
5
6
7
8
9
10
11
-- Merge 문이 없다.. 비슷한 역할을 하는 문법으로 Merge문 대체
-- DELETE 는 안되는 듯. INSERT || UPDATE
 
INSERT INTO 결과테이블
            ( )
                    
       VALUES
            ( )
             
ON DUPLICATE KEY UPDATE
             A = #{a}
 
 

MS-SQL

( https://docs.microsoft.com/ko-kr/sql/t-sql/statements/merge-transact-sql?view=sql-server-ver15 )

MyBatis : <update></update>
DAO.java : update
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-- mappper.xml작성시 쿼리문 마지막에 ";" 필수로 붙여야한다. 안 그러면 에러발생
-- Merge문에서 insert할때 sequence를 사용할 수 없다! (중요) 따라서 selectKey로 먼저 시퀀스 조회 후 사용해야 한다.
 
      -- 이렇게 시퀀스를 조회하면 VO의 해당 필드값에 적용이 바로 되기 때문에 Insert문에서 파라미터로 넘겨주기만 하면 된다. 
      -- BEFORE : Merge문 전에 먼저 실행한다.
      <selectKey keyProperty="시퀀스 필드값" resultType="String" order="BEFORE"> 
          SELECT NEXT VALUE FOR 시퀀스
      </selectKey>
 
       MERGE INTO 최종 결과 적용 테이블
        USING (VALUES(1)) DUAL (Number) -- 자기 자신 테이블
        ON ( -- 처리 결정하는 조건 )
        
            -- ON 조건과 일치하는 경우
            WHEN MATCHED THEN 
                  -- 쿼리문
                  
            WHEN NOT MATCHED THEN
                  -- 쿼리문
            ;
Colored by Color Scripter
 
 

Oracle

( 공식 레퍼런스보다 구글링이 더 이해하기 쉽습니당... )

MyBatis : <update></update>
DAO.java : update
 
1
2
3
4
5
6
7
8
9
    MERGE INTO 최종 결과 적용 테이블
        USING DUAL
        ON ( -- 처리 결정하는 조건)
        
             WHEN MATCHED THEN
                 -- 쿼리문
                    
             WHEN NOT MATCHED THEN
                 -- 쿼리문

 

'DataBase' 카테고리의 다른 글

[HackerRank] Ollivander's Inventory  (0) 2020.07.12
[HackerRank] Symmetric Paris  (0) 2020.06.10
[Oracle] 페이징, concat 등 표현  (0) 2019.06.02
INSERT문에 SELECT 가능!  (0) 2019.06.02
[MySQL] 페이징 시 쿼리 LIMIT, OFFSET  (0) 2019.06.02

댓글