DB

[MSSQL] MERGE 문법

조셉LEE 2024. 2. 21. 14:01
728x90
반응형

개인적으로 MERGE는 괜찮은것 같다는 생각이 든다.

UPDATE , INSERT, DELETE를 쉽게 할수 있기 때문인가 사용방법은 아래를 보고 알아서 사용하시기를

단점 : 입력하는 테이블이 LINK로 연결된 테이블이면 사용이 불가하다는점 명심하기 바란다. 반대로 가져오고자 하는 테이블은 LINK로 연결된 테이블이 가능하다. 아무것도 모르는 필자는 그것 때문에 반나절을 삽질하고 있었다는

==== 구문 =======

 MERGE [입력할 테이블] AS A
  USING [가져올 테이블(SELECT A,B,C,D,E FROM TEMP WHERE A = 1)] AS B
     ON A.KEY1 = B.KEY1 AND A.KEY2 = B.KEY2
WHEN MATCHED THEN
   UPDATE SET A.C = B.C, A.D= B.D, A.E = B.E
WHEN NOT MATCHED THEN
   INSERT (A,B,C,D,E)
   VALUES (B.A, B.B, B.C, B.D, B.E)
WHEN NOT MATCHED BY SOURCE THEN 
        DELETE ;

====== 설명 ========

[저장할 테이블명] -- Data를 입력하고자 하는 테이블명

[조회할 테이블명] -- 조회할 테이블명 또는 join을 이용한 쿼리문. 저장할 테이블과 동일한 모양으로 만들어준다. 조건도 여기서 다 처리하여 순수하게 저장할 DATA만 가져오도록 한다.

ON A.KEY = B.KEY -- 여기서 키값은 PK값 넣어주는게 좋다 중복값에 의한 에러가 날수 있으므로 (예 키값이 2개이면 ON A.KEY1 = B.KEY1 AND A.KEY2 = B.KEY2 AND ) join문 작성하듯이 열심히 만들면 된다.

WHEN MATCHED THEN -- UPDATE 일경우

UPDATE SET -- UPDATE 구문은 테이블명 과 조건절 없이 사용

WHEN NOT MATCHED THEN -- INSERT 일경우

INSERT () VALUES() -- INSERT 구문은 테이블명 없이 사용

마지막 마무리는 세미콜론(;) 꼭 해주도록 한다.

====== 예제 ==========

  MERGE [CIM].[dbo].[AAAAAAAA] AS A
  USING (SELECT C.* FROM BBBBBB C INNER JOIN [CIM].[dbo].[CCCC] D ON C.OrderNo = D.OrderNo WHERE InterfaceNum = @INTERFACE) AS B
     ON A.OrderNo = B.OrderNo 
   WHEN MATCHED THEN
   UPDATE SET A.MaterialNo = B.MaterialNo, A.UpdateDateTime = GETDATE()
   WHEN NOT MATCHED THEN  
   INSERT (OrderNo, MaterialNo, UpdateDateTime)
    VALUES(B.OrderNo, B.MaterialNo, GETDATE());

 

 

반응형
LIST