개인적으로 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());
'DB' 카테고리의 다른 글
[MSSQL] LOCK 걸린거 찾기 (0) | 2024.02.22 |
---|---|
[MSSQL] 프로시져, FUNCTION, TRIGGER 전체 찾기 (0) | 2024.02.22 |
[오라클] ANSI Join 에 using문 사용 (0) | 2024.02.20 |
[MSSQL] 날짜 구하기 (1) | 2024.02.20 |
[MSSQL] PIVOT - 날짜 상위 10개 가져와서 PIVOT 하기 (0) | 2024.02.20 |