Database

MSSQL MERGE 예제

Urong 2020. 11. 10. 17:24
728x90

MERGE

 

단일 문에서 여러 DML(INSERT, UPDATE, DELETE) 작업을 수행할 수 있다.

 

즉, 여러 개의 개별 DML문을 단일 문으로 대체할 수 있다.

 

작업이 하나의 문 내에서 수행되면서, 데이터가 처리되는 횟수가 최소화되고 쿼리 성능이 향상된다.

MERGE 변경될테이블명 AS A 
	USING (SELECT 컬럼명 FROM 기준테이블명) AS B 
	ON (A.컬럼명 = B.컬럼명 AND A.컬럼명 = B.컬럼명) 
	WHEN MATCHED AND 조건 THEN 
		INSERT (A.컬럼명) 
		VALUES(B.컬럼명) 
	WHEN NOT MATCHED AND 조건 THEN 
		UPDATE SET A.컬렴명 = B.컬럼명 
	WHEN NOT MATCHED AND 조건 THEN 
		DELETE;

 

재귀쿼리에 MERGE 사용

tBM에서 BM_UpIDs 와 BM_LoIDs 로 재귀쿼리를 사용하고 이것을 tBMTR이라는 테이블에 전부 넣어주었다.

변경이 있을경우 UPDATE까지 타도록... 원래는 트리거를 이용하려 했으나

필자가 트리거를 선호하지 않기 때문에 아래와 같은 코드를 프로시저에 담아서 사용하게 되었다.

프로시저에서 변수를 받아서 처리를 하면 부분 재귀를 타게 되고 tBMTR에 전부 업데이트 되어서

재귀쿼리를 사용하는 곳에 그냥 SELECT만 하게하는 방식으로 속도를 나아지게 하려는 의도인데

수시로 UPDATE, INSERT가 일어나서 비용을 많이 잡아먹는다. 

조금 더 고민해 보도록 하고 MERGE의 기능만 잘 익혀두었다.

	WITH c (
                  c_BM_IDs
                , c_Grp_M_IDs
                , c_BM_UpIDs
                , c_BM_LoIDs
                , c_Lv
                , c_Sort_BM_IDs
        )
        AS
        (
            SELECT    BM_i
                    , BM_LoIDs    grpM_IDs
                    , BM_UpIDs
                    , BM_LoIDs
                    , 0           Lv       -- 처음시작이므로 레벨0
                    ----------------------------------------------------------------------------------------------
                    , '_' + REPLICATE('0', 5  - LEN(1000 - BM_LoIDs)) + CAST((1000 - BM_LoIDs) AS VARCHAR(255))   Sort_BM_IDs 
            FROM tBM
            WHERE BM_UpIDs = 0

            UNION ALL

            SELECT    BM_i
                    , c_Grp_M_IDs
                    , BM_UpIDs
                    , BM_LoIDs
                    , c_Lv + 1    --Lv         -- 재귀 멤버 실행될 때마다 1씩 증가
                    ----------------------------------------------------------------------------------------------
                    , c_Sort_BM_IDs   + '_' + REPLICATE('0', 5  - LEN(1000 - BM_LoIDs)) + CAST((1000 - BM_LoIDs) AS VARCHAR(255))            Sort_BM_IDs
            FROM tBM
            INNER JOIN c  ON c_BM_IDs = BM_UpIDs 
        )
		MERGE INTO tBMTR 
		USING C ON c_BM_IDs = BMTR_BM_i
		WHEN MATCHED THEN
			UPDATE SET BMTR_BM_UpID = c_BM_UpIDs
						, BMTR_BM_LoID = c_BM_LoIDs
						, BMTR_Lv = c_Lv
						, BMTR_Sort_ID = c_Sort_BM_IDs
		WHEN NOT MATCHED THEN
			INSERT (BMTR_BM_i, BMTR_Grp_ID, BMTR_BM_UpID, BMTR_BM_LoID, BMTR_Lv, BMTR_Sort_ID, BMTR_D_ID) 
			VALUES (c_BM_IDs
				, c_Grp_M_IDs
				, c_BM_UpIDs
				, c_BM_LoIDs
				, c_Lv	
				, c_Sort_BM_IDs
				, c_D_ID);
728x90
반응형