-
MSSQL MERGE 예제Database 2020. 11. 10. 17:24728x90
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반응형'Database' 카테고리의 다른 글
MSSQL tempDB (0) 2020.11.26 MSSQL 테이블 확인 Tip (0) 2020.11.12 DB백업로그 안남기기 (0) 2020.11.04 SORT 영역을 적게 사용하도록 SQL 작성 (0) 2020.11.04 파티션 확인하고 파티션테이블별로 조회하기 (0) 2020.11.04